为什么这个凿子代码编译时没有错误大小 UInt 分配错误?

Why this chisel code compiling without error with wrong size UInt assignement?

我在我的顶部声明了一个像这样的模块端口(这是一个错误)RawModule:

class TopMyModule extends RawModule {
...
  val enet1_tx_data0 = IO(Output(Bool()))
  val enet1_tx_data1 = IO(Output(Bool()))
...
  val tx1data = IO(Output(Bool()))
...

然后这样连接:

  tx1data := enet1_tx_data1 ## enet1_tx_data0

“##”运算符应将大小为 no 的向量中的两位连接起来? 但它编译没有任何错误。 如果我查看 verilog 生成的代码,我会看到连接已完成,但只有最低有效位用于输出:

...
  wire [1:0] _T_1; // @[spiDualkszRmiiChecker.scala 73:29]
...
  assign _T_1 = {enet1_tx_data1,enet1_tx_data0}; // @[spiDualkszRmiiChecker.scala 73:29]
...
  assign tx1data = _T_1[0]; // @[spiDualkszRmiiChecker.scala 73:11]

在我看来 tx1data 应该声明为 2 位 UInt :

  val tx1data = IO(Output(UInt(2.W)))

但令我惊讶的是第一个版本没有产生任何错误。

我相信这是一个原创的设计决定,有些人喜欢,有些人不喜欢。这个问题有很好的讨论Remove implicit width truncation / Don't repeat Verilog's assignment issue in Chisel #1163。请随时插话。