2016-09-22 65 views
1

假设我有一个小的矢量:Verilog中是否存在自动矢量宽度强制?

wire [15:0] a; 

,我将其分配到一个较大的载体:

reg [31:0] b; 

always @(posedge clk) begin 
    b <= a; 
end 

会是什么结果呢? b会在其高位字中分配零,还是高位部分保持不变?还有别的吗?

我试过寻找其他来源的答案,但是我发现所有的例子在左边的匹配宽度都是赋值的右边的操作数。

回答

6

Verilog在这种情况下的行为已被很好地定义。随着你的榜样,因为默认值是签名,你会得到这种行为:

  • 如果a左手位(15位)是1'b01'b1然后a将扩展到32个位宽通过零填充。即b的位31至16将是1'b0

  • 如果a左手位(位15)是1'bx1'bz然后a将通过复制该值被扩展到32个位宽。即b的位31至16将是1'bx,如果位15是1'bz1'bz,如果位15是1'bx

如果a签署,也就是说,如果a被声明如下:

wire signed [15:0] a; 

然后

  • 时左手位是1'bx1'bz将是行为就像它是无符号一样 - 该值只是复制。

  • 当左手位是1'b01'b1该左手位是符号扩展,即再次证明左手位的值只是复制。此行为不是取决于b是有符号还是无符号,只有取决于a是有符号还是无符号。

+0

如果任何reg有符号或无符号,它是否会在硬件中产生差异? –

+1

不,我不这么认为。 –

1

结果将在高位中指定零。合成也是可能的。

module larger(input [7:0]a, output [15:0] b); 
    assign b = a; 
endmodule 

检查你的自我这个代码。