从现有的Chisel代码生成Verilog代码的最简单方法是什么?
我是否必须创建自己的构建文件?
例如,从一个独立的scala文件(AND.scala),如下所示..
import Chisel._
class AND extends Module {
val io = IO(new Bundle {
val a = Bool(INPUT)
val b = Bool(INPUT)
val out = Bool(OUTPUT)
})
io.out := io.a & io.b
}
Run Code Online (Sandbox Code Playgroud)
我在ubuntu 16.4下安装了完整的Chisel3工具链.
我已经定义了这样的向量寄存器
val my_reg = Reg(Vec(n, Bits(32.W)))
Run Code Online (Sandbox Code Playgroud)
我使用来在for循环中访问该寄存器的元素my_reg(i)。
现在,我想将此寄存器初始化为零,所以我将变量定义更改为此
val my_reg = Reg(Vec(n, Bits(32.W)), init = UInt(0))
Run Code Online (Sandbox Code Playgroud)
但是,当我要访问该寄存器的元素时,出现以下编译错误
chisel3.core.Data does not take parameters
my_reg(i) := io.a(i)
Run Code Online (Sandbox Code Playgroud)
如何定义向量寄存器并正确地对其进行同步初始化?
作为tile,如何在Chisel3中以正确的方式将UInt转换为SInt值?IG:
val opC = RegInit(0.U(64.W))
val result = RegInit(0.U(64.W))
result := Mux(opC.toSInt > 0.S, opC, 0.U)
Run Code Online (Sandbox Code Playgroud) 我为我的特定数据声明了一个捆绑包:
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) 我有以下测试代码并使用--genHarness调用chiseMain.Verilog是为线束生成的,但它不包含Tester类中的任何逻辑.对于为什么我没有得到我期望的逻辑的任何想法?我正在使用Chisel 2.10.
码:
class TestMultiPortedMem(c: MultiPortedMem) extends Tester(c) {
var i = 0
// Write address as data
for (p <- c.io.wports) {
poke(p.wen, 1)
poke(p.addr, i)
poke(p.wdata, i)
step(1)
i = i + 1
}
// Read it back
i = 0
for (p <- c.io.rports) {
poke(p.addr, i)
step(1)
expect(p.rdata, i)
i = i + 1
}
}
object TestMem {
def main(args: Array[String]): Unit = {
//chiselMainTest(Array[String]("--backend", "v", "--genHarness"),
chiselMainTest(args,
() => Module(new MultiPortedMem(1,1,1,128,32))){c => new TestMultiPortedMem(c)} …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) 作为标题,我想将 Vec(Bool()) 转换为 UInt 值。
例如
class MyModule extends Module {
val io = IO(new Bundle {
val in_data = Input (Vec (3, Bool() )
val result = Output(UInt(5.W))
})
//how can I convert io.in_data to Uint and the assign to io.result
//I will get io.result = 7 when in_data(1, 1, 1)
}
Run Code Online (Sandbox Code Playgroud) Chisel 教程使用了似乎是<>操作符的东西,这对我来说是完全陌生的。它有什么作用?
还有,它从哪里来?这个运算符在其他 Scala 库甚至其他语言中是否有传统含义?
下面是一个使用示例,来自 Chisel Generator Bootcamp 练习,第 3.2 节:
class MyQueue extends Module {
// Example circuit using a Queue
val io = IO(new Bundle {
val in = Flipped(Decoupled(UInt(8.W)))
val out = Decoupled(UInt(8.W))
})
val queue = Queue(io.in, 2) // 2-element queue
io.out <> queue
}
Run Code Online (Sandbox Code Playgroud) 寻找有关如何使用 RegEnable 作为向量的示例/建议。另外,我想控制输入和使能信号成为向量中寄存器索引的函数。
首先,如何声明 RegEnable() 的 Vector,其次如何迭代它并连接输入和启用。在 RegEnable() 情况下,声明和连接是在同一语句中进行的。就像是:
for (j <- 0 until len) {
val pipe(j) = RegEnable(in(j),en(j))
}
Run Code Online (Sandbox Code Playgroud)
上面的代码无法编译。& en 中还有向量或位选择
这似乎不是一件容易的事情,甚至是不可能的,但我们正在使用一种命名约定,在 verilog 中为输入/输出使用前缀或后缀“i_”或“o_”的信号。
是否有一些方法可以在 chisel 库中混淆或覆盖它?
我看到除了时钟和复位,所有信号都有“io”前缀。是否可以只使用“i”作为输入和“o”作为输出?