私は 16 ビットの数値を持っていますが、これはx
(つまり、不明な) 可能性があります。
数値を 32 ビットにゼロ拡張したいのですが、MSB が の場合、ゼロ拡張ではなく -拡張x
したいと考えていますx
。(これは私のシミュレーションに役立ちます。)
これどうやってするの?
私は 16 ビットの数値を持っていますが、これはx
(つまり、不明な) 可能性があります。
数値を 32 ビットにゼロ拡張したいのですが、MSB が の場合、ゼロ拡張ではなく -拡張x
したいと考えていますx
。(これは私のシミュレーションに役立ちます。)
これどうやってするの?
符号付きの値を扱っていない限り、これにはカスタム関数が必要になると思います。符号付きの値を使用している場合、符号ビットが 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
例:
$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