Chisel是Verilog和VHDL等经典硬件描述语言(HDL)的替代品.我在Verilog的经验及其在工业界和学术界的现有流行表明,它是一种发达的成熟语言.
使用Chisel一段时间的人可以分享您的经验并帮助解释Chisel对经典HDL的效用吗?
到目前为止,我作为本科IC设计专业学生的经历包括:
我有一个表,其中表的每一行包含状态(寄存器).有逻辑选择一个特定的行.只有一行接收"选定"信号.然后访问该选定行的状态.状态的一部分作为输出连接到模块的IO,或者IO的一部分用作输入以更新状态.
如果我用电路实现这个,我会使用传递门.所选信号将导通一组传输门,这将把行的寄存器连接到总线.然后总线将连接到IO捆绑包.这是快速,小面积和低能量.
在Chisel中有一种直接的实现方法.它将所选行编码为二进制数,然后将该数字应用于传统多路复用器的选择输入.不幸的是,对于具有20到50行的表以及数百位的状态,这种实现可能非常慢,并且在面积和能量上浪费.
这个问题有两个部分:1)有没有办法在Chisel中指定总线,这样你就有传输门或传统的三态驱动器都挂在总线上?
2)如果不这样做,Chisel中有一个快速,小面积,低能量的方式吗?
谢谢
我正在寻找一个简单的howto来转换Verilog中的简单Chisel3模块.
我在凿子的官方网页上给出了Gcd源代码.
import chisel3._
class GCD extends Module {
val io = IO(new Bundle {
val a = Input(UInt(32.W))
val b = Input(UInt(32.W))
val e = Input(Bool())
val z = Output(UInt(32.W))
val v = Output(Bool())
})
val x = Reg(UInt(32.W))
val y = Reg(UInt(32.W))
when (x > y) {
x := x -% y
}.otherwise {
y := y -% x
}
when (io.e) {
x := io.a
y := io.b
}
io.z := x
io.v := y === 0.U …Run Code Online (Sandbox Code Playgroud) Berkeley的RISC-V实现称为Rocket Chip,它是用一种名为Chisel的硬件语言编写的.Chisel是面向对象的,我们团队中的人员很难学会如何有效地修改Rocket Chip代码.
我们为Chisel创造了这个学习之旅,这很棒.它来自基础知识,包括Scala的相关部分,最后是一系列来自Sodor和Rocket Chip代码的高级示例,所有这些都是动手练习:
http://learningjourney.intensivate.com
我们已经向社区开放了贡献,但似乎应该有其他好的地方来解释Rocket Chip代码中使用的高级Chisel编码实践.有人有链接吗?
我是一名软件开发人员,试图了解 RISC-V 平台级中断控制器 (PLIC) 的配置,该控制器位于 FPGA 中火箭芯片衍生的 SoC 中。如果我的术语有问题,请纠正我。
我正在尝试在热启动后以编程方式配置 PLIC,特别是清除中断挂起位。我读过RISC-V PLIC 规范,其中谈到最多 15872 个上下文。虽然我当然可以迭代所有上下文,每个上下文有 1024 个中断,但我希望更加经济。
在哪里可以找到上下文的实际数量?对于所有火箭芯片设计来说它都是恒定的吗?它是一个可调值吗?应该问 FPGA 同事什么问题?他们使用凿子,我认为这是某种设计语言或工具。
我一直在研究Chisel以及各种Lavas(堪萨斯,Chalmers和Xilinx口味)和CLaSH的来源.我试图了解Chisel与其他产品的主要卖点是什么.我发现的主要是快速模拟.
我想知道深入研究的人是否可以指出其他优点,缺点和权衡取舍.
(对不起,如果讨论问题太多了.我试着向凿子用户发帖,但显然你需要被接受为会员才能这样做.)
为了测试我的 Chisel 设计,我将Icarus与cocotb一起使用。但是,如果在 verilog 模块代码中没有明确询问 Icarus 不会生成 VCD 跟踪,如下所示:
`ifdef COCOTB_SIM
initial begin
$dumpfile ("my_module_name.vcd");
$dumpvars (0, my_module_name);
#1;
end
`endif
Run Code Online (Sandbox Code Playgroud)
为了在每次生成 chisel 模块时添加此内容,我编写了一个名为cocotbify.py 的Python 小脚本,在生成的模块下“注入”此代码。
同样,要添加一些 systemVerilog assert()/assume() 以使用yosys-smtbmc进行正式检查,我必须在生成的每个 verilog 模块下“注入”代码。我还破解了一个名为smtbmcify.py的小 python 脚本来注入我的断言/假设代码。
我意识到这是一个 hack,但我找不到直接在 Chisel 模块下执行此操作的好方法。我知道有BlackBox,但我不想实例化子模块,并且函数 setInline 创建第二个 verilog 文件(我想直接在模块中写入)。
我在 Chisel scala 代码中看到了一种名为ChiselAnnotation的类型,但我不确定这是要使用的东西,我现在不知道如何使用。
我想实例化一维元素数组,元素扩展模块.我该怎么做?如果我说出我最好的猜测,那就是:
val elements = Vec( 64, new element )
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
[error] /Users/mykland/work/chisel/array.scala:20: overloaded method value apply with alternatives:
[error] [T <: Chisel.Data](n: Int, gen: => T)Chisel.Vec[T] <and>
[error] [T <: Chisel.Data](elt0: T, elts: T*)Chisel.Vec[T] <and>
[error] [T <: Chisel.Data](gen: => T, n: Int)Chisel.Vec[T]
[error] cannot be applied to (Int, ascenium.element)
[error] val elements = Vec( 64, new element )
[error] ^
Run Code Online (Sandbox Code Playgroud)
提前感谢您提供的任何帮助.
我有一些关于凿子转换的问题。我知道这是理论上的,但如果有人提出他的意见会很好。
1)想问为什么Chisel不注重VHDL/SystemVerilog的转换。虽然 Verilog 和 VHDL 是相同的,但在一些国家,尤其是欧洲,更喜欢 VHDL。2) 同样,C++模型用于仿真模型。为什么不是 SystemC 用于此目的?
我正在阅读一些笔记,发现 FIRRTL 是转换 CHISEL-->FIRRTL--> Verilog 和 CHISEL ---> FIRRTL--> C++ 模型的中间人。
使用(低)FIRRTL 规范转换 VHDL 和 SystemC 模型是个好主意吗?
当我从学习之旅项目运行示例凿子设计时,我看到如下错误:
$ ./run-examples.sh SimpleALU
...
[info] Set current project to chisel-tutorial (in build file:/home/fchen/work/learning-journey/)
[error] Expected ';'
[error] test:run-main examples.Launcher SimpleALU
[error] ^
Run Code Online (Sandbox Code Playgroud)
有谁知道可能出了什么问题?