Verilog更改右侧的大小

Verilog更改右侧的大小,verilog,Verilog,我有一个如下的基本模块来演示一些东西 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,因为 U是101 Tis011 而U+~T+001is 101 100 001 +______ = 1010 C得到0

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

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,因为

U
101

T
is
011

U+~T+001
is

   101
   100
   001
+______
= 1010 
C得到010部分,E得到1。这是预期的行为,然而,我得到的C与0相同,但E与0相同。我认为verilog正在将RHS变量的大小增加到4位,因为左侧是4位(1+3)。然而,对于T,它在对T进行补码之前追加前导0,因此T变为0011,其补码恰好是1100,而不是T补码的4位版本0100

这就导致,

   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

的宽度决定。如果操作数混合了不同的宽度,Verilog会根据表达式的上下文将每个操作数调整为最大操作数的宽度。您正确地注意到LHS为4位,RHS上的操作数扩展为4位。这在应用操作之前发生

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

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

现在,
~T
的宽度完全取决于
T

的宽度基本上是你想要的吗?欧文,我检查了答案,但没有联系,也许你能说出一点,这就是你想要的?欧文,我检查了答案,但没有联系,也许你能说出一点,太棒了!简短有效的回答,非常感谢。事实上,我尝试过几次使用花括号,但我想我没有尝试过这种特殊的方法。太棒了!简短有效的回答,非常感谢。事实上,我尝试过几次使用花括号,但我想我没有尝试过这种特殊的方法。