如果数字有效则如何对数字进行零扩展,否则对其进行X扩展?

时间:2013-03-19 01:58:36

标签: verilog

我有一个16位数字,可能是x(即未知) 我想将数字零扩展到32位,但如果MSB是x,那么我希望它是x - 扩展而不是零扩展。 (这有助于我的模拟。)

我该怎么做?

2 个答案:

答案 0 :(得分:3)

除非您使用签名值,否则我认为您需要一个自定义函数。如果使用有符号值,如果符号位为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

答案 1 :(得分:1)

如果您的模拟器足够现代以支持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

/*
Output:

a='bxxxxxxxxxxxxxxxx b='bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
a='b1111111111111111 b='b00000000000000001111111111111111
a='b0000000000000000 b='b00000000000000000000000000000000
a='bzzzzzzzzzzzzzzzz b='b0000000000000000zzzzzzzzzzzzzzzz
*/