为什么这个凿子代码编译时没有错误大小 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。请随时插话。
我在我的顶部声明了一个像这样的模块端口(这是一个错误)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。请随时插话。