116 lines
2.4 KiB
Coq
116 lines
2.4 KiB
Coq
|
|
/*
|
||
|
|
* This program tests the synthesis of small memories, including
|
||
|
|
* aysnchronous read w/ synchronous write.
|
||
|
|
*/
|
||
|
|
module main;
|
||
|
|
|
||
|
|
reg [1:0] mem;
|
||
|
|
reg D;
|
||
|
|
reg rst, clk, wr, wadr, radr;
|
||
|
|
|
||
|
|
/*
|
||
|
|
* This implements the synchronous write port to the memory.
|
||
|
|
* Asynchronous reset? In this case, yes, even though that is
|
||
|
|
* not normally the case for RAM devices.
|
||
|
|
*/
|
||
|
|
(* ivl_synthesis_on *)
|
||
|
|
always @(posedge clk or posedge rst)
|
||
|
|
if (rst) begin
|
||
|
|
mem[0] <= 0;
|
||
|
|
mem[1] <= 0;
|
||
|
|
end else if (wr) begin
|
||
|
|
mem[wadr] <= D;
|
||
|
|
|
||
|
|
end else begin
|
||
|
|
end
|
||
|
|
|
||
|
|
/* This is the asynchronous read port from the memory. */
|
||
|
|
wire 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 if (mem[0] !== 0 || mem[1] !== 0) begin
|
||
|
|
$display("FAILED -- Reset: 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: mem[0]=%b, mem[1]=%b", mem[0], mem[1]);
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
|
||
|
|
D = 1;
|
||
|
|
wr = 1;
|
||
|
|
#1 clk = 1;
|
||
|
|
#1 clk = 0;
|
||
|
|
|
||
|
|
// Make sure write works.
|
||
|
|
if (mem[0] !== 1 || mem[1] !== 0) begin
|
||
|
|
$display("FAILED -- write D=%b: mem[0]=%b, mem[1]=%b",
|
||
|
|
D, mem[0], mem[1]);
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
|
||
|
|
D = 0;
|
||
|
|
wadr = 1;
|
||
|
|
#1 clk = 1;
|
||
|
|
#1 clk = 0;
|
||
|
|
|
||
|
|
// Make sure write works.
|
||
|
|
if (mem[0] !== 1 || mem[1] !== 0) 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 = 1;
|
||
|
|
|
||
|
|
// Make sure memory remembers written values.
|
||
|
|
if (mem[0] !== 1 || mem[1] !== 0) 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
|