首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成Verilog代码时如何将所有变量名称保持在凿子中

生成Verilog代码时如何将所有变量名称保持在凿子中
EN

Stack Overflow用户
提问于 2019-03-28 15:34:51
回答 1查看 1.5K关注 0票数 2

凿子中的注册名可以在verilog中找到。

但电线名称有时在verilog代码中省略。

例如,我在verilog中找不到sjwr ,sjwaddr名称。

代码语言:javascript
复制
  val sjwr = Wire(Bool()) 
  val sjwaddr = Wire(UInt(jcnt.getWidth.W))
  sjwr    := jcnt_rdy 
  sjwaddr := jcnt
  when (sjwr) { sjBuf(sjwaddr) := sjxv }  

当我们生成verilog代码时,我如何将所有变量名保持在chisel中。

这对波形调试很重要。

EN

回答 1

Stack Overflow用户

发布于 2019-03-28 17:00:05

谢谢您对Chisel的兴趣!

一个名字可能正在消失的原因有几个。

常传播

由于许多原因,包括与现有CAD工具的互操作性、性能和Verilog调试能力,Chisel (实际上是Chisel下的FIRRTL编译器)将传播常量和直接连接。例如:

代码语言:javascript
复制
class MyModule extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(8.W))
    val out = Output(UInt(8.W))
  })
  val wire = Wire(UInt(8.W))
  wire := io.in
  io.out := wire
}

在上面的代码中,wire将被删除,因为它只是连接到io.in,Verilog将只显示:

代码语言:javascript
复制
assign io_out = io_in;

不能点名

凿子模块被实现为Scala类。由于实现原因,在默认情况下,Chisel只能在模块主体中命名“顶级”vals,例如:

代码语言:javascript
复制
class MyModule extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(8.W))
    val in2 = Input(UInt(8.W))
    val out = Output(UInt(8.W))
  })
  val sum = io.in + io.in2 // this is a top-level val, will be named

  // A method, we can call to help generate code:
  def inc(x: UInt): UInt = {
    val incremented = x + 1.U // We cannot name this, it's inside a method
    incremented
  }

  io.out := inc(sum)
}

suggestName

您可以通过调用.suggestName("name")来手动命名任何信号,例如。

代码语言:javascript
复制
  def inc(x: UInt): UInt = {
    val incremented = x + 1.U // We cannot name this, it's inside a method
    incremented.suggestName("incremented") // Now it is named!
  } 

输入@chiselName

编辑:本节适用于v3.4.0之前的Chisel版本。在v3.4.0中,Chisel添加了Scala编译器插件,以便进行更好的命名,因此不再需要@chiselName。有关文档,请参见网站:https://www.chisel-lang.org/chisel3/docs/explanations/naming.html

我们可以通过一个名为@chiselName的实验特性来解决上述问题,如下所示:

代码语言:javascript
复制
import chisel3.experimental.chiselName

@chiselName
class MyModule extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(8.W))
    val in2 = Input(UInt(8.W))
    val out = Output(UInt(8.W))
  })
  val sum = io.in + io.in2 // this is a top-level val, will be named

  // A method, we can call to help generate code:
  def inc(x: UInt): UInt = {
    val incremented = x + 1.U // We cannot name this, it's inside a method
    incremented
  }

  io.out := inc(sum)
}

@chiselName是一个注释,可以在任何classobject定义上使用,并将确保像incremented这样的注释可以被命名。@chiselName有效地重写了您的代码,使.suggestName到处都是。

我希望这能帮到你!

编辑更多信息:

禁用优化

我认为它还没有发布(最近的版本是3.1.7,这将在3.2.0中),但是我们有一个选项可以禁用所有的优化。您可以将使用的“编译器”从verilog更改为mverilog (用于“最小”Verilog,即。没有优化)。这可以用命令行参数-X mverilog来完成,无论是在Chisel还是FIRRTL中。

别碰

您还可以使用chisel3.dontTouch将信号标记为不应该删除的内容。这将防止优化移除信号。例如:

代码语言:javascript
复制
import chisel3.dontTouch
class MyModule extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(8.W))
    val out = Output(UInt(8.W))
  })
  val wire = dontTouch(Wire(UInt(8.W)))
  wire := io.in
  io.out := wire

编辑2:我已经为Chisel 3.2更新了dontTouch从包chisel3.experimental转移到常规的chisel3

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55401525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档