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

Meh*_*dad 1 verilog

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

我怎样才能做到这一点?

dwi*_*kle 5

除非您使用带符号的值,否则我认为您将需要一个自定义函数。如果您使用有符号值,如果符号位为 X,MSB 将从 16 位值到 32 位值的赋值进行 X 扩展。但是,如果 MSB(符号位)为 1,则它将是 1-extended,如果您使用无符号值,这很可能不是您想要的。

这是一个简单的函数来做到这一点。

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
Run Code Online (Sandbox Code Playgroud)

例子:

$display("%032b", extend(16'h0000));
$display("%032b", extend(16'hFFFF));
$display("%032b", extend(16'bX000_0000_0000_0000));
Run Code Online (Sandbox Code Playgroud)

输出:

00000000000000000000000000000000
00000000000000001111111111111111
xxxxxxxxxxxxxxxxx000000000000000
Run Code Online (Sandbox Code Playgroud)