为什么此凿子代码在错误的UInt分配下正确编译?

问题描述 投票:1回答:1

我在顶部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)))

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

hdl chisel
1个回答
0
投票

我相信这是一个原始的设计决定,有些人喜欢,有些人不喜欢。关于此问题Remove implicit width truncation / Don't repeat Verilog's assignment issue in Chisel #1163进行了很好的讨论。请随时鸣叫。

© www.soinside.com 2019 - 2024. All rights reserved.