我对scala和Chisel很新.我试图创建一个动态大小的Shiftregister示例,但我不确定以下代码是否正确.如果有人可以审查它会很好:
import Chisel._
class Shiftregister(length: Int) extends Module {
val io = new Bundle {
val clk = UInt(INPUT, 1)
val load = UInt(INPUT, 1) // 1 read from s_data_in, 0 read from p_data_in
val s_data_in = UInt(INPUT, 1)
val s_data_out = UInt(OUTPUT, 1)
val p_data_in = UInt(INPUT, length)
val p_data_out = UInt(OUTPUT, length)
}
val bitfield = Reg(init = UInt(length))
when (io.load.toBool()) {
bitfield := Cat(io.s_data_in, bitfield(length, 1))
}
.otherwise {
bitfield := io.p_data_in
}
io.p_data_out := Reg(next = …Run Code Online (Sandbox Code Playgroud) 这似乎在凿子2中有效,但现在不起作用:
class TestX extends Module
{
val io = IO(new Bundle {
val a = Output(UInt(width=2))
})
io.a(1, 0) := UInt(0)
}
Run Code Online (Sandbox Code Playgroud)
错误:[模块TestX]表达式T_4用作FEMALE,但只能用作MALE。
此更改的解决方法是什么?
我不确定我是否从以下地方了解如何使用getVerilog函数:https : //github.com/freechipsproject/chisel-bootcamp/blob/master/2.1_first_module.ipynb
[error] passthrough_test.scala:18:11: not found: value getVerilog
[error] println(getVerilog(new PassThrough(10)))
[error] ^
[error] one error found
[error] (Test / compileIncremental) Compilation failed
[error] Total time: 1 s, completed Nov 21, 2018 1:53:02 PM
Run Code Online (Sandbox Code Playgroud)
我确实导入了chisel3._,但这似乎还不够。
我是 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) 我正在学习Chisel,遵循Github上的文档
到目前为止,一切都完美无瑕.但我坚持第13章 "功能模块创建"
我无法让代码工作.我在凿子模板项目的副本中创建了所有的.scala类.以下是我编写/复制以创建具有可变位宽的Mux4的内容:
/ chisel-template/src/main/scala/Mux4.scala
import Chisel._
class Mux4(w: Int) extends Module {
val io = IO(new Bundle {
val sel = UInt(INPUT, 2)
val in0 = UInt(INPUT, w)
val in1 = UInt(INPUT, w)
val in2 = UInt(INPUT, w)
val in3 = UInt(INPUT, w)
val out = UInt(OUTPUT, w)
})
io.out := Mux2(io.sel(1),
Mux2(io.sel(0), io.in0, io.in1),
Mux2(io.sel(0), io.in2, io.in3))
}
class Mux2(w: Int) extends Module {
val io = IO(new …Run Code Online (Sandbox Code Playgroud) 我是凿子的新手,如果有人能解释一下:
1- 队列 2- 去耦 IO 3- 去耦 3- 有效 IO 4- 有效
这段凿子代码正确吗?
...
val a = Decoupled()
val b = Decoupled()
val c = Decoupled()
Run Code Online (Sandbox Code Playgroud)
...
val Reg_a = Reg(UInt())
val Reg_b = Reg(UInt())
Run Code Online (Sandbox Code Playgroud)
...
when(io.a.valid && io.a.ready && io.b.valid && io.b.ready && io.c.valid && io.c.ready)
{
Reg_a := io.a.bits.data
Reg_b := io.b.bits.data
}
io.c.bits := Reg_a & Reg_b
Run Code Online (Sandbox Code Playgroud)
...
Module.io.a <> Queue(Module_1.io.a_1)
Module.io.b <> Queue(Module_1.io.b_1)
Module_1.io.c_1 <> Queue(Module.io.c)
Run Code Online (Sandbox Code Playgroud)
问候!
我正在写一个图书馆包,我不想在其他(本地)项目中使用它。我是否需要重新启动命令:
$ sbt publishLocal
Run Code Online (Sandbox Code Playgroud)
每次进行修改还是有可能使其自动化?
我正在将这个Chisel模板项目用于build.sbt。
您可能知道 Verilog 中的“输出 reg”,这是非常有用的功能。
但是在 Chisel 中,我找不到如何做类似的事情。当我需要寄存器输出时,我应该这样做:
package filter
import chisel3._
class TestReg extends Module {
val io = IO( new Bundle {
val din = Input(SInt(32.W))
val ena = Input(Bool())
val dout = Output(SInt())
})
val dout = RegInit(0.S(32.W))
when (io.ena) {
dout := io.din + 77.S
}
io.dout <> dout
}
Run Code Online (Sandbox Code Playgroud)
是否有更“短”的方式来创建输出 reg?
我正在寻找的是在 IO 包中定义 Reg 并将其写入 register
类似这样的东西:
class TestReg extends Module {
val io = IO( new Bundle {
val din = Input(SInt(32.W))
val ena …Run Code Online (Sandbox Code Playgroud) 我有一个使用 peekpoketester 的凿子测试台。我有一个要在测试平台中使用的 C++ 库。有没有办法在 chisel/scala 中做到这一点?
我有一个如下所示的模块:
class ComputationIO[T <: Data](val OperandType: T) extends Bundle {
val data = OperandType.cloneType
}
class Computation [T <: Data] (OperandType: T) extends Module {
val io = IO( new Bundle {
val in = Input(new ComputationIO(OperandType))
})
// REST OF THE CODE HERE...
}
Run Code Online (Sandbox Code Playgroud)
而且,我正在实例化Computation以下内容:
val compUnit = for (i <- 0 until nParal) yield {
val Comp = Module(new Computation(UInt(32.W)))
Comp
}
Run Code Online (Sandbox Code Playgroud)
但是,虽然我传递UInt(32.W)给构造函数,但它给了我以下错误:
firrtl.passes.CheckInitialization$RefNotInitializedException:Reference compUnit is not fully initialized.
[error] : compUnit.io.in.OperandType …Run Code Online (Sandbox Code Playgroud) 是否可以将一些Verilog代码包装到凿子/标量代码中?如果是,我该怎么做?我需要在凿子中使用一些verilog模块。
谢谢
弗朗切斯科
我一直在网上查找##在凿子中的含义,但无法在任何地方找到它.
例如,在此代码段中:
val ways = Module(new BRAM(log2Up(conf.lines), conf.ways * line_size))
val din = Vec.fill(conf.ways) { Bits(width=line_size) }
if(conf.ways == 2) {
ways.io.din := din(1) ## din(0)
}
Run Code Online (Sandbox Code Playgroud)
使用##表达式的if语句中的行是什么?谢谢!
可以在verilog中明确找到凿子中的寄存器名称。
但电汇名称有时会在Verilog代码中省略号。
例如,我sjwr ,sjwaddr在verilog中找不到名称。
val sjwr = Wire(Bool())
val sjwaddr = Wire(UInt(jcnt.getWidth.W))
sjwr := jcnt_rdy
sjwaddr := jcnt
when (sjwr) { sjBuf(sjwaddr) := sjxv }
Run Code Online (Sandbox Code Playgroud)
当我们生成Verilog代码时,如何将所有变量名保留在凿子中。
对于wave调试很重要。