所以,我有一个关于Chisel代码转换的理论问题.
我知道Chisel实际上是一组Scala定义,因此它被编译为Java字节码,而Java字节码又在JVM中运行,就像魔术一样,它为旧版本的Chisel吐出了Verilog等效描述甚至C++描述.
关键是我无法弄清楚这种"神奇"是如何起作用的.我的猜测是从Chisel到Verilog/C++的代码转换都是基于Scala反射.但我不确定,因为我找不到任何与此主题相关的内容.
那么,它是关于反思吗?如果是这样,我们的运行时反射是编译时间吗?有人可以给我一个线索吗?
非常感谢.
我是Chisel的新学习者.克隆在Chisel中的目的是什么?我在某处写到,"它创建了一个浅层副本".我们为什么需要它?这是一些例子.你能详细说明吗?
1)
class Valid[+T <: Data](gen: T) extends Bundle
{
val valid = Output(Bool())
val bits = Output(gen.chiselCloneType)//?????
def fire(): Bool = valid
override def cloneType: this.type = Valid(gen).asInstanceOf[this.type]
}
/** Adds a valid protocol to any interface */
object Valid {
def apply[T <: Data](gen: T): Valid[T] = new Valid(gen)
}
Run Code Online (Sandbox Code Playgroud)
2)
class Packet(n: Int, w: Int) extends Bundle {
val address = UInt(Log2Up(n).W)
val payload = UInt(w.W)
override def cloneType: this.type =
new Packet(n, w).asInstanceOf[this.type]
}
Run Code Online (Sandbox Code Playgroud)
为什么cloneType是Override.它是否像Scala中的apply方法,或者只是更新Bundle中的cloneType方法.
谢谢
我有一些关于凿子转换的问题。我知道这是理论上的,但如果有人提出他的意见会很好。
1)想问为什么Chisel不注重VHDL/SystemVerilog的转换。虽然 Verilog 和 VHDL 是相同的,但在一些国家,尤其是欧洲,更喜欢 VHDL。2) 同样,C++模型用于仿真模型。为什么不是 SystemC 用于此目的?
我正在阅读一些笔记,发现 FIRRTL 是转换 CHISEL-->FIRRTL--> Verilog 和 CHISEL ---> FIRRTL--> C++ 模型的中间人。
使用(低)FIRRTL 规范转换 VHDL 和 SystemC 模型是个好主意吗?
是否有一些内置的测试或工具用于对 chisel 或 firrtl 设计与生成的 verilog 进行形式验证?verilog 后端建立在哪些概念上?里面有什么bug吗?
我有一些类似的寄存器定义,我想在regmap构造下编写.我的代码目前看起来像这样:
val regs = RegInit(Vec(Seq.fill(5)(0.U(32.W))))
regmap (
...
0x30 -> Seq(RegField(32,regs(0),RegFieldDesc("reg0",""),
0x34 -> Seq(RegField(32,regs(1),RegFieldDesc("reg1",""),
0x38 -> Seq(RegField(32,regs(2),RegFieldDesc("reg2",""),
0x3C -> Seq(RegField(32,regs(3),RegFieldDesc("reg3",""),
0x40 -> Seq(RegField(32,regs(4),RegFieldDesc("reg4",""),
...
)
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有办法使用Scala迭代器之一以更简洁的方式编写上述内容?我的另一个要求是我仍然需要能够在这个迭代器之前和之后添加寄存器(3个点线).
我相信,使用迭代器可以很好地防止复制/粘贴错误并且看起来更好.
在此先感谢您的帮助.
我在Chisel3中编写了一个单周期CPU,该CPU实现了大多数RV32I指令(CSR,Fence,ECALL / BREAK,LB / SB除外,稍后可能会提供这些指令)。目前,指令已在指令存储器中进行了硬编码,但是我将对其进行更改,以便它从文件中读取指令。我在如何实际模拟设计方面遇到麻烦。这是我将所有组件“粘合”在一起的代码。
class Core extends Module {
val io = IO(new Bundle {
val dc = Input(Bool())
})
io := DontCare
val pc = RegInit(0.U)
val pcSelect = Module(new PcSelect())
val pcPlusFour = Module(new Adder())
val alu = Module(new ALU())
val aluControl = Module(new AluControl())
val control = Module(new Control())
val immGen = Module(new ImmGen())
val branchLogic = Module(new BranchLogic())
val branchUnit = Module(new Adder())
val jumpReg = Module(new JumpReg())
val regFile = Module(new RegFile())
val jumpAdder …Run Code Online (Sandbox Code Playgroud) 我今天更新了火箭芯片,并注意到FIRRTL现在这样说:
------------------------------------------------------------------------------
Warning: firrtl.Driver is deprecated since 1.2!
Please switch to firrtl.stage.FirrtlStage
------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
好的,很公平,我想我们必须更新传递给FIRRTL的内容:
FIRRTL ?= java -Xmx3G -Xss8M -XX:MaxPermSize=256M $(FIRRTL_PROFILE_SWITCH) -cp $(FIRRTL_JAR) firrtl.Driver
Run Code Online (Sandbox Code Playgroud)
但是,天真地切换firrtl.Driver到firrtl.stage.FirrtlStage它不起作用:
Error: Main method not found in class firrtl.stage.FirrtlStage, please define the main method as:
public static void main(String[] args)
Run Code Online (Sandbox Code Playgroud)
为了避免此过时警告,我们应该怎么做?
当我从学习之旅项目运行示例凿子设计时,我看到如下错误:
$ ./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)
有谁知道可能出了什么问题?
我正在尝试编写一个缓存内存,所以我创建了一个Seq类型,Mem因为我试图同时访问一组缓存中的所有元素。
val metaMem = Seq.fill(nWays) (Mem((nSets), new MetaData))
Run Code Online (Sandbox Code Playgroud)
然后我想有如下索引:
metaMem(way).write(set, MD)
Run Code Online (Sandbox Code Playgroud)
但是,因为方式UInt在我的代码中,并且 seq 只接受Int索引,所以会导致编译错误。有没有人对如何解决这个问题有任何建议?非常感谢
class PEControl[T <: Data : Arithmetic](accType: T),这是来自 riscv-gemmini 的类定义。的Data类型是在凿的基本数据类型,Arithmetic提供了关于某些算术运算Data,和abstract class Arithmetic[T <: Data]。
用于的语法是<: Type : Type什么,这是什么意思?我发现语法是TypeParamBounds ::= TypeBounds {‘:’ Type}从这里调用的。哪里可以详细了解一下,谢谢。