105 lines
2.0 KiB
Coq
105 lines
2.0 KiB
Coq
|
|
// 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
|