目录
一、目标
用verilog实现一个深度为16,位宽8bit的单端口SRAM。搭建一个仿真环境,完成初始化,读取,写入的操作
二、结构图
三、设计代码
module single_ram#(
parameter ADDR_WIDTH = 4,
parameter MEM_DEPTH = 16,
parameter DATA_WIDTH = 8
)(
input clk,
input wr_en,
input rd_en,
input [DATA_WIDTH-1:0] din,
input [ADDR_WIDTH-1:0] addr,
output reg [DATA_WIDTH-1:0] dout
);
reg [DATA_WIDTH-1:0] mem [MEM_DEPTH-1:0];
// synopsys_translate_off
integer i;
initial begin
for(i=0; i<MEM_DEPTH;i=i+1)
begin
mem[i] = 8'h00;
end
end
// synopsys_translate_on
always@(posedge clk)
begin
if(rd_en)
begin
dout <= mem[addr];
end
else
begin
if(wr_en)
begin
mem[addr] <= din;
end
end
end
endmodule
Synopsys提供了引导语句,设计者可以使用这些引导语句控制DC综合的对象。
在设计代码中,引导语句“// synopsys translate_off”后直到“// synopsys translate_on”之间的语句被DC忽略。
四、测试代码
`timescale 1ns / 1ps
module sram_tb(
);
parameter ADDR_WIDTH = 4,
parameter MEM_DEPTH = 16,
parameter DATA_WIDTH = 8
reg [ADDR_WIDTH-1 : 0] addr;
reg [DATA_WIDTH-1 : 0]data_in;
reg clk;
reg wr_en;
reg rd_en;
wire [DATA_WIDTH-1 : 0] data_out;
integer i;
//clock generation
initial begin
clk = 0;
forever
#4 clk = ~clk;
end
initial begin
rd_en = 1'b0;
wr_en = 1'b0;
addr = 4'd0;
data_in = 8'h00;
#20
@(negedge clk)//read
rd_en = 1'b1;
for (i = 0; i<16; i=i+1) begin
@(negedge clk)
addr = i;
end
@(negedge clk)//write
wr_en = 1'b1;
for (i = 0; i<16; i=i+1) begin
@(negedge clk) begin
addr = i;
data_in = data_in + 'h01;
end
end
@(negedge clk)//read
wr_en = 1'b0;
for (i = 0; i<16; i=i+1) begin
@(posedge clk)
addr = i;
end
@(negedge clk)
rd_en = 1'b0;
//#100 $finish;
#100 $stop;
end
single_ram #(parameter ADDR_WIDTH = 4,
parameter MEM_DEPTH = 16,
parameter DATA_WIDTH = 8)
u_sram(
.clk(clk),
.rd_en(rd_en),
.wr_en(wr_en),
.addr(addr),
.din(data_in),
.dout(data_out)
);
endmodule
参考链接