Verilog改变右手边的大小

Verilog changing the size of right hand side

我有一个如下的基本模块来演示一些东西。

module tb();

reg [2:0] U;
reg [2:0] T;
reg [2:0] C;
reg E;

initial begin

    U = 5;
    T = 3;
    {E, C} = U + ~T + 1'b1;
    #1000;

end

endmodule

我期望 E 为 1,因为;

U101

T011

U + ~T + 001是,

   101
   100
   001
+______
= 1010 

所以,C 得到 010 部分,E 得到 1。这是预期的行为,但是,我得到 C 相同但 E 为 0。我认为 verilog 正在将 RHS 变量的大小增加到 4 位,因为左手边是 4 位(1+3)。但是,对于T,它在补T之前附加了前导0,所以T变成了0011,它的补码恰好是1100,而不是0100,T补码的4位版本。

这导致,

   0101
   1100
   0001
+______
= 10010 

这导致 E 为 0,如图所示。

我不明白为什么会这样,也找不到在添加前导零之前进行补码的方法。

如果我改为执行以下操作,它工作正常并且 E 得到 1:

    U = 5;
    T = 3;
    T = ~T;
    {E, C} = U + T + 1'b1;

这证实了我的猜测是对的。所以,我确实有这样的解决方案,是的。但是,我对此并不满意,我认为应该有一种方法可以防止这种行为。

如有任何帮助,我们将不胜感激。

当您有混合不同宽度的操作数时,Verilog 有规则根据表达式的上下文将每个操作数的大小调整为最大操作数的宽度。您正确地注意到 LHS 是 4 位,RHS 上的操作数扩展到 4 位。这发生在之前应用操作。

您可以利用连接的操作数是自定上下文这一事实来解决此问题:

{E, C} = U + {~T} + 1'b1;

现在~T的宽度完全由T的宽度决定。