2023-09-13 05:47:18 -05:00
|
|
|
verific -sv <<EOF
|
|
|
|
|
|
|
|
module top(clk);
|
|
|
|
input wire clk;
|
|
|
|
|
|
|
|
parameter DEPTH_LOG2 = 4;
|
|
|
|
parameter DEPTH = 2**DEPTH_LOG2;
|
|
|
|
parameter BYTEWIDTH = 8;
|
|
|
|
parameter WIDTH = BYTEWIDTH*4;
|
|
|
|
parameter PRIME1 = 237481091;
|
|
|
|
parameter PRIME2 = 296851369;
|
|
|
|
|
|
|
|
(* ram_style = "block" *)
|
|
|
|
reg [WIDTH-1:0] mem [DEPTH-1:0];
|
|
|
|
|
|
|
|
integer i;
|
|
|
|
initial begin
|
|
|
|
for (i = 0; i < DEPTH; i = i + 1) begin
|
|
|
|
// Make up data by multiplying a large prime with the address,
|
|
|
|
// then cropping and retaining the lower bits
|
|
|
|
mem[i] = PRIME1 * i;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
reg [DEPTH_LOG2-1:0] counter = 0;
|
|
|
|
reg done = 1'b0;
|
|
|
|
always @(posedge clk) begin
|
|
|
|
if (!done)
|
2023-10-20 11:31:41 -05:00
|
|
|
counter = counter + 1'b1;
|
2023-09-13 05:47:18 -05:00
|
|
|
if (counter == 0)
|
2023-10-20 11:31:41 -05:00
|
|
|
done = 1'b1;
|
2023-09-13 05:47:18 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
wire [WIDTH-1:0] old_data = PRIME1 * counter;
|
|
|
|
wire [WIDTH-1:0] new_data = PRIME2 * counter;
|
|
|
|
|
|
|
|
reg [WIDTH-1:0] expect_old_data;
|
|
|
|
reg [WIDTH-1:0] expect_mixed_data;
|
|
|
|
|
|
|
|
always @(posedge clk) begin
|
|
|
|
if (!done) begin
|
|
|
|
expect_old_data <= mem[counter];
|
|
|
|
mem[counter][31:24] <= new_data[31:24];
|
|
|
|
mem[counter][23:16] = new_data[23:16]; // !!! is blocking
|
|
|
|
mem[counter][15:8] <= new_data[15:8];
|
|
|
|
mem[counter][7:0] <= new_data[7:0];
|
|
|
|
expect_mixed_data <= mem[counter];
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
reg done_delay1 = 1'b1;
|
|
|
|
reg [WIDTH-1:0] new_data_delay1 = 1'b1;
|
|
|
|
reg [WIDTH-1:0] old_data_delay1 = 1'b1;
|
|
|
|
|
|
|
|
always @(posedge clk) begin
|
|
|
|
if (!done_delay1) begin
|
|
|
|
assert(expect_old_data == old_data_delay1);
|
|
|
|
assert(expect_mixed_data[31:24] == old_data_delay1[31:24]);
|
|
|
|
assert(expect_mixed_data[23:16] == new_data_delay1[23:16]);
|
|
|
|
assert(expect_mixed_data[15:0] == old_data_delay1[15:0]);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
reg [DEPTH_LOG2-1:0] counter_delay1;
|
|
|
|
always @(posedge clk) begin
|
|
|
|
counter_delay1 <= counter;
|
|
|
|
done_delay1 <= done;
|
|
|
|
new_data_delay1 <= new_data;
|
|
|
|
old_data_delay1 <= old_data;
|
|
|
|
end
|
|
|
|
|
|
|
|
reg [DEPTH_LOG2-1:0] counter_delay2;
|
|
|
|
reg done_delay2 = 1'b1;
|
|
|
|
reg [WIDTH-1:0] new_data_delay2 = 1'b1;
|
|
|
|
always @(posedge clk) begin
|
|
|
|
counter_delay2 <= counter_delay1;
|
|
|
|
done_delay2 <= done_delay1;
|
|
|
|
new_data_delay2 <= new_data_delay1;
|
|
|
|
end
|
|
|
|
|
|
|
|
always @(posedge clk) begin
|
|
|
|
if (!done_delay2)
|
|
|
|
assert(mem[counter_delay2] == new_data_delay2);
|
|
|
|
end
|
|
|
|
|
|
|
|
endmodule
|
|
|
|
EOF
|
|
|
|
|
|
|
|
hierarchy -top top
|
|
|
|
proc
|
|
|
|
opt_clean
|
|
|
|
memory -nomap
|
|
|
|
select -assert-count 1 t:$mem_v2
|
|
|
|
sim -assert -clock clk -n 20
|