iverilog/ivtest/ivltests/nb_ec_concat.v

105 lines
2.0 KiB
Coq
Raw Normal View History

// Check that non-blocking event control assignments to concatanations work as
// expected.
module test;
reg failed = 1'b0;
`define check(val, exp) \
if (val !== exp) begin \
$display("FAILED. %s: expected %b, got %b.", `"val`", exp, val); \
failed = 1'b1; \
end
reg [3:0] x;
reg [3:0] y;
reg [3:0] z[1:0];
integer i = 0;
event e;
initial begin
// Test all of
// * vector
// * vector part select
// * array element
// * array element part
// Immediate index
{z[1][1:0],z[0],y[1:0],x} <= @e 12'h5a5;
#1
// Assignment must not occur until the event is triggered
`check(z[1], 4'bxxxx)
`check(z[0], 4'bxxxx)
`check(y, 4'bxxxx)
`check(x, 4'bxxxx)
->e;
`check(z[1], 4'bxx01);
`check(z[0], 4'b0110);
`check(y, 4'bxx10);
`check(x, 4'b0101);
x = 4'hx;
y = 4'hx;
z[0] = 4'hx;
z[1] = 4'hx;
// Immediate index reverse order
{x,y[1:0],z[0],z[1][1:0]} <= @e 12'ha5a;
#1
`check(z[1], 4'bxxxx)
`check(z[0], 4'bxxxx)
`check(y, 4'bxxxx)
`check(x, 4'bxxxx)
->e;
`check(z[1], 4'bxx10);
`check(z[0], 4'b0110);
`check(y, 4'bxx01);
`check(x, 4'b1010);
x = 4'hx;
y = 4'hx;
z[0] = 4'hx;
z[1] = 4'hx;
// Variable index
{z[i+1][i+:2],z[i],y[i+:2],x} <= @e 12'h5a5;
#1
`check(z[1], 4'bxxxx)
`check(z[0], 4'bxxxx)
`check(y, 4'bxxxx)
`check(x, 4'bxxxx)
->e;
`check(z[1], 4'bxx01);
`check(z[0], 4'b0110);
`check(y, 4'bxx10);
`check(x, 4'b0101);
x = 4'hx;
y = 4'hx;
z[0] = 4'hx;
z[1] = 4'hx;
// Variable index reverse order
{x,y[i+:2],z[i],z[i+1][i+:2]} <= @e 12'ha5a;
#1
`check(z[1], 4'bxxxx)
`check(z[0], 4'bxxxx)
`check(y, 4'bxxxx)
`check(x, 4'bxxxx)
->e;
`check(z[1], 4'bxx10);
`check(z[0], 4'b0110);
`check(y, 4'bxx01);
`check(x, 4'b1010);
if (!failed) begin
$display("PASSED");
end
end
endmodule