iverilog/ivtest/ivltests/sv-2val-nets.v

41 lines
1.2 KiB
Verilog

// This tests part selects of 2-value logic vectors through
// module ports. This is not supported in SystemVerilog, but
// we expect it to work as an Icarus Verilog extension, as
// long as all the bits of the 2-value are singly driven.
module main;
bit [5:0] a, b;
wire bit [6:0] sum;
wire bit c2, c4;
sub b10 (.c_i(1'b0), .a(a[1:0]), .b(b[1:0]), .out(sum[1:0]), .c_o(c2));
sub b32 (.c_i(c2), .a(a[3:2]), .b(b[3:2]), .out(sum[3:2]), .c_o(c4));
sub b54 (.c_i(c4), .a(a[5:4]), .b(b[5:4]), .out(sum[5:4]), .c_o(sum[6]));
bit [6:0] idxa, idxb;
initial begin
for (idxa = 0 ; idxa < 'b1_000000 ; idxa = idxa+1) begin
for (idxb = 0 ; idxb < 'b1_000000 ; idxb = idxb+1) begin
a = idxa;
b = idxb;
#1 /* wait for devices to settle */;
if (idxa + idxb != sum) begin
$display("FAILED: %0d + %0d --> %0d", a, b, sum);
$stop;
end
end
end // for (idxa = 0 ; idxa < 'b1_000000 ; idxa = idxa+1)
$display("PASSED");
$finish;
end // initial begin
endmodule // main
module sub (input wire bit c_i, input wire bit[1:0] a, b,
output wire bit [1:0] out, output wire bit c_o);
assign {c_o, out} = {1'b0, a} + {1'b0, b} + {2'b00, c_i};
endmodule // sub