iverilog/ivtest/ivltests/memsynth1.v

114 lines
2.3 KiB
Coq
Raw Normal View History

/*
* This program tests the synthesis of small memories, including
* aysnchronous read w/ synchronous write.
*/
module main;
reg [3:0] mem [1:0], D;
reg rst, clk, wr, wadr, radr;
/*
* This implements the synchronous write port to the memory.
*/
(* ivl_synthesis_on *)
always @(posedge clk)
if (rst) begin
mem[0] <= 0;
mem[1] <= 0;
end else if (wr) begin
mem[wadr] <= D;
end
/* This is the asynchronous read port from the memory. */
wire [3:0] Q = mem[radr];
(* ivl_synthesis_off *)
initial begin
rst = 0;
clk = 0;
wadr = 0;
radr = 0;
wr = 0;
#1 clk = 1;
#1 clk = 0;
// Make sure reset works.
rst = 1;
#1 clk = 1;
#1 clk = 0;
#1 if (mem[0] !== 0 || mem[1] !== 0) begin
$display("FAILED -- Reset 1: mem[0]=%b, mem[1]=%b", mem[0], mem[1]);
$finish;
end
radr = 0;
#1 if (Q !== mem[radr]) begin
$display("FAILED -- mem[%b] = %b, Q=%b", radr, mem[radr], Q);
$finish;
end
radr = 1;
#1 if (Q !== mem[radr]) begin
$display("FAILED -- mem[%b] = %b, Q=%b", radr, mem[radr], Q);
$finish;
end
rst = 0;
#1 clk = 1;
#1 clk = 0;
// Make sure memory remembers value.
if (mem[0] !== 0 || mem[1] !== 0) begin
$display("FAILED -- Reset 2: mem[0]=%b, mem[1]=%b", mem[0], mem[1]);
$finish;
end
D = 7;
wr = 1;
#1 clk = 1;
#1 clk = 0;
// Make sure write works.
if (mem[0] !== 7 || mem[1] !== 0) begin
$display("FAILED -- write D=%b: mem[0]=%b, mem[1]=%b",
D, mem[0], mem[1]);
$finish;
end
D = 2;
wadr = 1;
#1 clk = 1;
#1 clk = 0;
// Make sure write works.
if (mem[0] !== 7 || mem[1] !== 2) begin
$display("FAILED -- write D=%b: mem[0]=%b, mem[1]=%b",
D, mem[0], mem[1]);
$finish;
end
radr = 0;
#1 if (Q !== mem[radr]) begin
$display("FAILED -- mem[%b] = %b, Q=%b", radr, mem[radr], Q);
$finish;
end
wr = 0;
D = 5;
// Make sure memory remembers written values.
if (mem[0] !== 7 || mem[1] !== 2) begin
$display("FAILED -- write D=%b: mem[0]=%b, mem[1]=%b",
D, mem[0], mem[1]);
$finish;
end
$display("PASSED");
$finish;
end
endmodule // main