假设我有一个小的矢量:Verilog中是否存在自动矢量宽度强制?
wire [15:0] a;
,我将其分配到一个较大的载体:
reg [31:0] b;
always @(posedge clk) begin
b <= a;
end
会是什么结果呢? b
会在其高位字中分配零,还是高位部分保持不变?还有别的吗?
我试过寻找其他来源的答案,但是我发现所有的例子在左边的匹配宽度都是赋值的右边的操作数。
假设我有一个小的矢量:Verilog中是否存在自动矢量宽度强制?
wire [15:0] a;
,我将其分配到一个较大的载体:
reg [31:0] b;
always @(posedge clk) begin
b <= a;
end
会是什么结果呢? b
会在其高位字中分配零,还是高位部分保持不变?还有别的吗?
我试过寻找其他来源的答案,但是我发现所有的例子在左边的匹配宽度都是赋值的右边的操作数。
Verilog在这种情况下的行为已被很好地定义。随着你的榜样,因为默认值是签名,你会得到这种行为:
如果a
左手位(15位)是1'b0
或1'b1
然后a
将扩展到32个位宽通过零填充。即b
的位31至16将是1'b0
。
如果a
左手位(位15)是1'bx
或1'bz
然后a
将通过复制该值被扩展到32个位宽。即b
的位31至16将是1'bx
,如果位15是1'bz
或1'bz
,如果位15是1'bx
。
如果a
是签署,也就是说,如果a
被声明如下:
wire signed [15:0] a;
然后
时左手位是1'bx
或1'bz
将是行为就像它是无符号一样 - 该值只是复制。
当左手位是1'b0
或1'b1
该左手位是符号扩展,即再次证明左手位的值只是复制。此行为不是取决于b
是有符号还是无符号,只有取决于a
是有符号还是无符号。
结果将在高位中指定零。合成也是可能的。
module larger(input [7:0]a, output [15:0] b);
assign b = a;
endmodule
检查你的自我这个代码。
如果任何reg有符号或无符号,它是否会在硬件中产生差异? –
不,我不这么认为。 –