Verilog 中是否有自动矢量宽度强制转换?
Is there automatic vector width coercion in Verilog?
假设我有一个小向量:
wire [15:0] a;
然后我将它分配给一个更大的向量:
reg [31:0] b;
always @(posedge clk) begin
b <= a;
end
结果会怎样? b
会在其高位字中分配零,还是高位部分保持不变?还有别的吗?
我尝试在其他来源中搜索答案,但我发现的所有示例在赋值的左右操作数中都有匹配的宽度。
Verilog 在这种情况下的行为已明确定义。对于您的示例,因为默认值是 unsigned,您将得到以下行为:
如果 a
的左手位(第 15 位)是 1'b0
或 1'b1
那么 a
将扩展为 32 位宽通过零填充。即 b
的第 31 到 16 位将是 1'b0
.
如果 a
的左手位(第 15 位)是 1'bx
或 1'bz
那么 a
将扩展为 32 位宽通过复制该值。即,如果位 15 为 1'bz
,则 b
的位 31 至 16 将为 1'bx
,如果位 15 为 1'bx
,则为 1'bz
。
如果 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
请自行检查此代码。
假设我有一个小向量:
wire [15:0] a;
然后我将它分配给一个更大的向量:
reg [31:0] b;
always @(posedge clk) begin
b <= a;
end
结果会怎样? b
会在其高位字中分配零,还是高位部分保持不变?还有别的吗?
我尝试在其他来源中搜索答案,但我发现的所有示例在赋值的左右操作数中都有匹配的宽度。
Verilog 在这种情况下的行为已明确定义。对于您的示例,因为默认值是 unsigned,您将得到以下行为:
如果
a
的左手位(第 15 位)是1'b0
或1'b1
那么a
将扩展为 32 位宽通过零填充。即b
的第 31 到 16 位将是1'b0
.如果
a
的左手位(第 15 位)是1'bx
或1'bz
那么a
将扩展为 32 位宽通过复制该值。即,如果位 15 为1'bz
,则b
的位 31 至 16 将为1'bx
,如果位 15 为1'bx
,则为1'bz
。
如果 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
请自行检查此代码。