楼上正解, 小弟再补充下:
首先我们分析一下这个问题的由来.楼主遇到的情况实际上是关于verilog 表达式位宽的问题, 也就是所谓的expression bit lengths的问题. 再细化下,就发现是表达式做evaluation也就是更新值的时候位宽如何对齐而产生的问题.
比如一个reg [3:0] sum;
reg[2:0]a,b;
sum = a + b; // expression evaluates using 4 bits
这就是一个自动扩位的情况.
正如楼主所说的情况,verilog是不会自动扩位的. 那么这很容易产生一个疑惑,就是在那些情况会扩位那些情况又不扩位呢?
当然,verilog会有一个明确的规定:
在说这个规定前,首先有个关于self-determined(这个determined 就是决定其宽度的意思) expression的说法.关于这个说法我是这样理解的,就是对于一个表达式,如果它不是self-determined的,那么它必然又有其他的原因帮他来确定宽度的,在我遇到的情况里面这个其他原因就是赋值语句的左边位宽的情况.
好,我们反过来看self-determined expression有那些属于这个
attached
如图所示,这些都是self-determined expression楼主所遇到的如图倒数第二排的{},说到这里大家应该比较清楚了吧,楼主所遇到的情况正是因为使用了self-determined expression从而让右边表达式自己已经决定了自己的位宽,从而不会把进位位扩展到左边.而如果不使用上图中的这些情况如sum = a + b; 位宽会随右值的宽度进行改变.
s |