假设我有一个小向量:
reg [31:0] b;
always @(posedge clk) begin
b <= a;
end
我将它分配给更大的矢量:
b
结果会是什么? <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
是否会在其较高的单词中分配零,或者高级部分是否保持不变?还有别的吗?
我已经尝试在其他来源中搜索答案,但我发现的所有示例都在左侧匹配宽度和赋值的右侧操作数。
答案 0 :(得分:6)
在这种情况下,Verilog的行为已经明确定义。在您的示例中,因为默认值为 unsigned ,您将获得此行为:
如果a
的左手位(位15)为1'b0
或1'b1
,那么a
将通过零填充扩展到32位宽。即b
的第31至16位将为1'b0
。
如果a
的左手位(位15)为1'bx
或1'bz
,则a
将通过复制该值扩展为32位宽。即如果第15位为b
,则1'bx
的第31位至第16位将为1'bz
,如果第15位为1'bz
,则为1'bx
。
如果a
签名,即如果a
声明如下:
wire signed [15:0] a;
然后
左手位为1'bx
或1'bz
时的行为与未签名时的行为相同 - 只是复制了该值。
当左手位为1'b0
或1'b1
左手位为符号扩展时,即左手位的值仅为复制。此行为不取决于b
是已签名还是未签名,仅是a
是已签名还是未签名。
答案 1 :(得分:1)
结果将在高位中分配零。合成也是可能的。
module larger(input [7:0]a, output [15:0] b);
assign b = a;
endmodule
为此代码检查自己。