我正在寻找一个简单的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) 为了测试我的 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的类型,但我不确定这是要使用的东西,我现在不知道如何使用。
我正在学习Chisel3.
我对这些代码有一些疑问.
val myVec = Wire(Vec(5, SInt(width = 23))) // Vector of 5 23-bit signed integers.
Run Code Online (Sandbox Code Playgroud)
我想如果我声明一个向量,我需要写"Wire",但是当我看到这些代码时我错了.
class BigBundle extends Bundle {
val myVec = Vec(5, SInt(width = 23)) // Vector of 5 23-bit signed integers.
val flag = Bool()
// Previously defined bundle.
val f = new MyFloat
}
Run Code Online (Sandbox Code Playgroud)
它突然冲到我的脸上,所以我想知道我什么时候使用"电线"?
提前致谢.
在 Rust 中,标准整数类型的大小为8、16、32、64、128 位。但是是否可以操作具有非标准大小的整数类型,例如u24, i7, ... ?
这些非标准尺寸对于 FPGA 算法仿真很有用。
我为我的特定数据声明了一个捆绑包:
class RValue (val cSize: Int = 16) extends Bundle {
val rvalue = Output(UInt(cSize.W))
val er = Output(UInt((cSize/2).W))
val part = Output(Bool()) /* set if value is partial */
}
Run Code Online (Sandbox Code Playgroud)
我想将它用作我的模块中的寄存器:
val valueReg = Reg(new RValue(cSize))
//...
valueReg.rvalue := 0.U
valueReg.er := 0.U
Run Code Online (Sandbox Code Playgroud)
效果很好。但我想在 Register 声明中使用 RegInit() 对其进行初始化。是否可以 ?
val valueReg = RegInit(new RValue(cSize), ?? ) ??
Run Code Online (Sandbox Code Playgroud) 也许这很容易,但我不能简单地找到如何在 Chisel 中获取 UInt() 值的位大小?
我知道如何通过声明设置大小:
val a = UInt(INPUT, 16)
Run Code Online (Sandbox Code Playgroud)
但是要获得“a”大小,是否有类似的属性:
val size = a.?
Run Code Online (Sandbox Code Playgroud)
或者 :
val size = width(a)
Run Code Online (Sandbox Code Playgroud) 为了测试我的 Verilog 设计,我使用了两个不同的模拟器:Icarus和Verilator。这是工作,但它们之间存在一些差异。
例如,我无法使用 verilator 读取模块参数,但 Icarus 可以工作。
有没有办法知道 python testfile 中正在使用哪个模拟器?
我想写这样的东西:
if SIM == 'icarus':
self.PULSE_PER_NS = int(dut.PULSE_PER_NS)
self.DEBOUNCE_PER_NS = int(dut.DEBOUNCE_PER_NS)
else:
self.PULSE_PER_NS = 4096
self.DEBOUNCE_PER_NS = 16777216
Run Code Online (Sandbox Code Playgroud)
能够管理两个模拟器并比较它们。
我是 Scala 的新手,我一直在尝试了解 RISC-V 架构。我遇到了这段代码,我一直盯着它看几个小时,无法理解。
val csignals =
ListLookup(io.dat.inst,
List(N, BR_N , OP1_X , OP2_X , ALU_X , WB_X , REN_0, MEN_0, M_X , MT_X, CSR.N),
Array( /* val | BR | op1 | op2 | ALU | wb | rf | mem | mem | mask | csr */
/* inst | type | sel | sel | fcn | sel | wen | en | wr | type | cmd */
LW -> List(Y, BR_N , OP1_RS1, OP2_IMI …Run Code Online (Sandbox Code Playgroud) 我想知道在AXI4Lite总线上进行简单访问的最小时钟周期是多少.
我认为这是4,但我不确定.
我正在写一个图书馆包,我不想在其他(本地)项目中使用它。我是否需要重新启动命令:
$ sbt publishLocal
Run Code Online (Sandbox Code Playgroud)
每次进行修改还是有可能使其自动化?
我正在将这个Chisel模板项目用于build.sbt。
在Clash官网,有如下例子:
>>> sampleN @System 4 (register 0 (pure (8 :: Signed 8)))
Run Code Online (Sandbox Code Playgroud)
我知道什么是纯函数,但为什么这里有这个关键字?如果我删除它,我会收到一个错误:
Clash.Prelude> sampleN @System 4 (register 0 (8 :: Signed 8))
<interactive>:2:32: error:
* Couldn't match expected type `Signal System a'
with actual type `Signed 8'
* In the second argument of `register', namely `(8 :: Signed 8)'
In the third argument of `sampleN', namely
`(register 0 (8 :: Signed 8))'
In the expression: sampleN @System 4 (register 0 (8 :: Signed 8))
* Relevant bindings include it …Run Code Online (Sandbox Code Playgroud)