单端口
rtl
module hand_ram_sp #(
parameter DATAWIDTH =8 ,
parameter ADDRSIZE =8
)
(
input clka ,
input ena ,
input wea ,
input [ADDRSIZE-1:0] addra ,
input [DATAWIDTH-1:0] dina ,
output reg [DATAWIDTH-1:0] douta
);
localparam DATADEPTH = 1<<ADDRSIZE;
reg [DATAWIDTH-1:0] mem [DATADEPTH-1:0];
always @(posedge clka ) begin
if(ena&&(~wea))begin
douta <= mem[addra];
end
else begin
douta <= 0;
end
end
always @(posedge clka ) begin
if(ena&&wea) begin
mem[addra] <= dina;
end
else begin
mem[addra] <= mem[addra];
end
end
endmodule
sim
`timescale 1ns / 1ps
module tb_hand_ram_sp;
parameter PERIOD = 10;
parameter DATAWIDTH = 8;
parameter ADDRSIZE = 4;
reg clk = 0 ;
reg ena = 0 ;
reg wea = 0 ;
reg [ADDRSIZE-1:0] addra = 0 ;
reg [DATAWIDTH-1:0] dina = 0 ;
wire [DATAWIDTH-1:0] douta ;
initial
begin
forever #(PERIOD/2) clk=~clk;
end
hand_ram_sp #(
.DATAWIDTH ( DATAWIDTH ),
.ADDRSIZE ( ADDRSIZE ))
u_hand_ram_sp (
.clka ( clk ),
.ena ( ena ),
.wea ( wea ),
.addra ( addra [ADDRSIZE-1:0] ),
.dina