我在顶部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进行了很好的讨论。请随时鸣叫。