x
我有一个可能是(即未知)的 16 位数字。
我想将数字零扩展为 32 位,但如果 MSB 是x
,那么我希望它被x
- 扩展而不是零扩展。(这有助于我的模拟。)
我怎样才能做到这一点?
x
我有一个可能是(即未知)的 16 位数字。
我想将数字零扩展为 32 位,但如果 MSB 是x
,那么我希望它被x
- 扩展而不是零扩展。(这有助于我的模拟。)
我怎样才能做到这一点?
除非您使用带符号的值,否则我认为您将需要一个自定义函数。如果您使用有符号值,如果符号位为 X,则 MSB 将在从 16 位值到 32 位值的赋值中进行 X 扩展。但是,如果 MSB(符号位)为 1,则它将被 1 扩展,如果您使用无符号值,这很可能不是您想要的。
这是一个简单的函数来做到这一点。
function [31:0] extend(input[15:0] in);
begin
if (in[15] === 1'bX) begin
extend = {16'hXXXX, in};
end else begin
extend = {16'h0000, in};
end
end
endfunction
例子:
$display("%032b", extend(16'h0000));
$display("%032b", extend(16'hFFFF));
$display("%032b", extend(16'bX000_0000_0000_0000));
输出:
00000000000000000000000000000000
00000000000000001111111111111111
xxxxxxxxxxxxxxxxx000000000000000
如果您的模拟器足够现代以支持 SystemVerilog 语法:
module tb;
reg [15:0] a;
reg [31:0] b;
initial begin
$monitor("a='b%b b='b%b", a, b);
#5 a= '1; extendo();
#5 a= '0; extendo();
#5 a= 'z; extendo();
end
task extendo;
b[15:0] = a[15:0];
b[31:16] = (a[15] === 1'bx) ? 'x : '0;
endtask
endmodule
输出:
a='bxxxxxxxxxxxxxxxx b='bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
a='b1111111111111111 b='b00000000000000001111111111111111
a='b0000000000000000 b='b00000000000000000000000000000000
a='bzzzzzzzzzzzzzzzz b='b0000000000000000zzzzzzzzzzzzzzzz