91 lines
1.1 KiB
Coq
91 lines
1.1 KiB
Coq
|
|
`timescale 1ns / 1ps
|
||
|
|
|
||
|
|
module test();
|
||
|
|
|
||
|
|
localparam period = 20;
|
||
|
|
|
||
|
|
reg clk;
|
||
|
|
reg rst;
|
||
|
|
|
||
|
|
reg [4:0] waddr;
|
||
|
|
reg [31:0] wdata;
|
||
|
|
reg wvalid;
|
||
|
|
reg wready;
|
||
|
|
|
||
|
|
always begin
|
||
|
|
clk = 1'b0;
|
||
|
|
#(period/2);
|
||
|
|
clk = 1'b1;
|
||
|
|
#(period/2);
|
||
|
|
end
|
||
|
|
|
||
|
|
always @(posedge clk) begin
|
||
|
|
if (rst)
|
||
|
|
wready <= 1'b0;
|
||
|
|
else if (!wready && wvalid)
|
||
|
|
wready <= 1'b1;
|
||
|
|
end
|
||
|
|
|
||
|
|
genvar b;
|
||
|
|
|
||
|
|
for (b = 0; b < 4; b = b + 1) begin : BYTE_BRAM_GEN
|
||
|
|
wire [7:0] data_in;
|
||
|
|
reg [7:0] byte_ram [31:0];
|
||
|
|
|
||
|
|
assign data_in = wdata[b*8 +: 8];
|
||
|
|
|
||
|
|
always @(posedge clk) begin
|
||
|
|
if (wvalid && wready)
|
||
|
|
byte_ram[waddr] <= data_in;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
wire [7:0] my_byte = BYTE_BRAM_GEN[0].byte_ram[0];
|
||
|
|
|
||
|
|
task automatic wait_for_wready;
|
||
|
|
|
||
|
|
begin : waiting
|
||
|
|
@(posedge wready); // wait for rising edge
|
||
|
|
end
|
||
|
|
|
||
|
|
endtask
|
||
|
|
|
||
|
|
task init_memory;
|
||
|
|
|
||
|
|
begin
|
||
|
|
@(posedge clk);
|
||
|
|
|
||
|
|
waddr <= 0;
|
||
|
|
wdata <= 1;
|
||
|
|
wvalid <= 1'b1;
|
||
|
|
|
||
|
|
wait_for_wready;
|
||
|
|
|
||
|
|
@(posedge clk);
|
||
|
|
@(posedge clk);
|
||
|
|
|
||
|
|
$display("my_byte %h", my_byte);
|
||
|
|
|
||
|
|
if (my_byte === 8'h01)
|
||
|
|
$display("PASSED");
|
||
|
|
else
|
||
|
|
$display("FAILED");
|
||
|
|
end
|
||
|
|
|
||
|
|
endtask
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
wdata = 32'd0;
|
||
|
|
wvalid = 1'b0;
|
||
|
|
|
||
|
|
rst = 1'b1;
|
||
|
|
#period;
|
||
|
|
rst = 1'b0;
|
||
|
|
|
||
|
|
init_memory;
|
||
|
|
|
||
|
|
$finish(0);
|
||
|
|
end
|
||
|
|
|
||
|
|
endmodule
|