在verilog中保留chisel中的注释

How to decipher comments in generated Verilog from chisel?

These are source locators and will show up in generated FIRRTL or Verilog. These tell you what line in a source file (Chisel or FIRRTL) was used to generate a specific line in the downstream FIRRTL or Verilog.

The format is generally: @[<file> <line>:<column> ...]

More than one source locator may be present.

Example

Consider the following example pulled from the BoringUtilsSpec. The line numbers (which do not start at zero as this was extracted from a larger file) are shown along with the column numbers. You can see how things line up between them. For example, the declaration of notA happens on line 27 column 20 and the assignment notA := ~a happens on line 30, column 10. You see 27:20 and 30:10 show up in the FIRRTL. In the Verilog, these get merged somewhat and you wind up with source locators indicating both 27:20 and 30:10:

scala 复制代码
// -------------------------------------------+----+
// File: BoringUtilsSpec.scala                |    |
// -------------------------------------------+----+
// Column Number                              |    |
// -------------------------------------------+----+
//           1         2         3         4  |    |
// 01234567890123456789012345678901234567890  |    |
// -------------------------------------------+----|
     class BoringInverter extends Module { // | 24 | Line Number
       val io = IO(new Bundle{})           // |  5 |
       val a = Wire(UInt(1.W))             // |  6 |
       val notA = Wire(UInt(1.W))          // |  7 |
       val b = Wire(UInt(1.W))             // |  8 |
       a := 0.U                            // |  9 |
       notA := ~a                          // | 30 |
       b := a                              // |  1 |
       chisel3.assert(b === 1.U)           // |  2 |
       BoringUtils.addSource(notA, "x")    // |  3 |
       BoringUtils.addSink(b, "x")         // |  4 |
     }                                     // |  5 |
// -------------------------------------------+----+

This produces the following FIRRTL:

复制代码
module BoringUtilsSpecBoringInverter : 
  input clock : Clock
  input reset : UInt<1>
  output io : {}

  wire a : UInt<1> @[BoringUtilsSpec.scala 26:17]
  wire notA : UInt<1> @[BoringUtilsSpec.scala 27:20]
  wire b : UInt<1> @[BoringUtilsSpec.scala 28:17]
  a <= UInt<1>("h00") @[BoringUtilsSpec.scala 29:7]
  node _T = not(a) @[BoringUtilsSpec.scala 30:13]
  notA <= _T @[BoringUtilsSpec.scala 30:10]
  b <= a @[BoringUtilsSpec.scala 31:7]
  node _T_1 = eq(b, UInt<1>("h01")) @[BoringUtilsSpec.scala 32:22]
  node _T_2 = bits(reset, 0, 0) @[BoringUtilsSpec.scala 32:19]
  node _T_3 = or(_T_1, _T_2) @[BoringUtilsSpec.scala 32:19]
  node _T_4 = eq(_T_3, UInt<1>("h00")) @[BoringUtilsSpec.scala 32:19]
  // assert not shown

And the following Verilog:

复制代码
module BoringUtilsSpecBoringInverter(
  input   clock,
  input   reset
);
  wire  _T; // @[BoringUtilsSpec.scala 30:13]
  wire  notA; // @[BoringUtilsSpec.scala 27:20 BoringUtilsSpec.scala 30:10]
  wire  _T_3; // @[BoringUtilsSpec.scala 32:19]
  wire  _T_4; // @[BoringUtilsSpec.scala 32:19]
  assign _T = 1'h1; // @[BoringUtilsSpec.scala 30:13]
  assign notA = 1'h1; // @[BoringUtilsSpec.scala 27:20 BoringUtilsSpec.scala 30:10]
  assign _T_3 = _T | reset; // @[BoringUtilsSpec.scala 32:19]
  assign _T_4 = _T_3 == 1'h0; // @[BoringUtilsSpec.scala 32:19]
  // assert not shown
endmodule

These are source locators and will show up in generated FIRRTL or Verilog. These tell you what line in a source file (Chisel or FIRRTL) was used to generate a specific line in the downstream FIRRTL or Verilog.

The format is generally: @[ : ...]

More than one source locator may be present.

Example

Consider the following example pulled from the BoringUtilsSpec. The line numbers (which do not start at zero as this was extracted from a larger file) are shown along with the column numbers. You can see how things line up between them. For example, the declaration of notA happens on line 27 column 20 and the assignment notA := ~a happens on line 30, column 10. You see 27:20 and 30:10 show up in the FIRRTL. In the Verilog, these get merged somewhat and you wind up with source locators indicating both 27:20 and 30:10:

// -------------------------------------------±---+

// File: BoringUtilsSpec.scala | |

// -------------------------------------------±---+

// Column Number | |

// -------------------------------------------±---+

// 1 2 3 4 | |

// 01234567890123456789012345678901234567890 | |

// -------------------------------------------±---|

class BoringInverter extends Module { // | 24 | Line Number

val io = IO(new Bundle{}) // | 5 |

val a = Wire(UInt(1.W)) // | 6 |

val notA = Wire(UInt(1.W)) // | 7 |

val b = Wire(UInt(1.W)) // | 8 |

a := 0.U // | 9 |

notA := ~a // | 30 |

b := a // | 1 |

chisel3.assert(b === 1.U) // | 2 |

BoringUtils.addSource(notA, "x") // | 3 |

BoringUtils.addSink(b, "x") // | 4 |

} // | 5 |

// -------------------------------------------±---+

This produces the following FIRRTL:

module BoringUtilsSpecBoringInverter :

input clock : Clock

input reset : UInt<1>

output io : {}

wire a : UInt<1> @[BoringUtilsSpec.scala 26:17]

wire notA : UInt<1> @[BoringUtilsSpec.scala 27:20]

wire b : UInt<1> @[BoringUtilsSpec.scala 28:17]

a <= UInt<1>("h00") @[BoringUtilsSpec.scala 29:7]

node _T = not(a) @[BoringUtilsSpec.scala 30:13]

notA <= _T @[BoringUtilsSpec.scala 30:10]

b <= a @[BoringUtilsSpec.scala 31:7]

node _T_1 = eq(b, UInt<1>("h01")) @[BoringUtilsSpec.scala 32:22]

node _T_2 = bits(reset, 0, 0) @[BoringUtilsSpec.scala 32:19]

node _T_3 = or(_T_1, _T_2) @[BoringUtilsSpec.scala 32:19]

node _T_4 = eq(_T_3, UInt<1>("h00")) @[BoringUtilsSpec.scala 32:19]

// assert not shown

And the following Verilog:

module BoringUtilsSpecBoringInverter(

input clock,

input reset

);

wire _T; // @[BoringUtilsSpec.scala 30:13]

wire notA; // @[BoringUtilsSpec.scala 27:20 BoringUtilsSpec.scala 30:10]

wire _T_3; // @[BoringUtilsSpec.scala 32:19]

wire _T_4; // @[BoringUtilsSpec.scala 32:19]

assign _T = 1'h1; // @[BoringUtilsSpec.scala 30:13]

assign notA = 1'h1; // @[BoringUtilsSpec.scala 27:20 BoringUtilsSpec.scala 30:10]

assign _T_3 = _T | reset; // @[BoringUtilsSpec.scala 32:19]

assign _T_4 = _T_3 == 1'h0; // @[BoringUtilsSpec.scala 32:19]

// assert not shown

endmodule

Caveats

Generator Bootcamp

If you are running this in the Chisel Bootcamp Jupyter Notebook or through an sbt console/REPL, the source locators may not make as much sense as there really isn't a file here with lines.

Difference with Annotation

These source locators are not Annotations, in case anyone has come across that name.

Annotations are metadata associated with circuit components. Source locators (which map to Info in the FIRRTL IR) are associated with specific statements in some source file. Under the hood they're just strings that get generated and then copied around. There is no guarantee that source locators will be preserved---they may be changed or deleted arbitrarily. Conversely, Annotations are preserved and renamed across transformations and have strong guarantees on how they behave.

Consequently, do not rely on source locators for anything other than an aid if you need to debug the Chisel or FIRRTL compiler stages.

相关推荐
XINVRY-FPGA12 小时前
XCVP1802-2MSILSVC4072 AMD Xilinx Versal Premium Adaptive SoC FPGA
人工智能·嵌入式硬件·fpga开发·数据挖掘·云计算·硬件工程·fpga
9527华安1 天前
国产安路FPGA开发设计培训课程,提供开发板+工程源码+视频教程+技术支持
fpga开发·fpga·安路·视频教程·培训·安路fpga
UVM_ERROR2 天前
硬件设计实战:解决Valid单拍采样失效问题(附非阻塞赋值与时序对齐核心要点)
驱动开发·fpga开发·github·芯片
brave and determined2 天前
可编程逻辑器件学习(day36):从沙粒到智能核心:芯片设计、制造与封装的万字全景解析
fpga开发·制造·verilog·fpga·芯片设计·硬件设计·芯片制造
步达硬件2 天前
【FPGA】FPGA开发流程
fpga开发
我爱C编程3 天前
【仿真测试】基于FPGA的完整16QAM通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·16qam·帧同步·卷积编码·viterbi译码·维特比译码·频偏锁定
s09071363 天前
ZYNQ DMA to UDP 数据传输系统设计文档
网络协议·fpga开发·udp
燎原星火*3 天前
QSPI IP核 基本参数
fpga开发
XINVRY-FPGA3 天前
XCVU9P-2FLGC2104I Xilinx AMD Virtex UltraScale+ FPGA
嵌入式硬件·机器学习·计算机视觉·fpga开发·硬件工程·dsp开发·fpga
FPGA_小田老师3 天前
FPGA Debug:PCIE一直自动重启(link up一直高低切换)
fpga开发·pcie debug·pcie初始化问题