Dual port RAM using Verilog

Dual port RAM using Verilog 

`timescale 1ns / 1ps
module dual_port_ram 
     # (parameter data_width=8,
              parameter addr_width=4,
                        parameter depth=16
                        )
    ( input clk, //clock
        input wr_en, //write enable for port 0
        input [data_width-1:0] data_in, //Input data to port 0.
        input [addr_width-1:0] addr_in_0, //address for port 0
        input [addr_width-1:0] addr_in_1, //address for port 1
        input port_en_0, //enable port 0.
        input port_en_1, //enable port 1.
        output [data_width-1:0] data_out_0, //output data from port 0.
        output [data_width-1:0] data_out_1 //output data from port 1.
    );

//memory declaration.S
reg [data_width-1:0] ram[0:depth-1];

//writing to the RAM
always@(posedge clk)
begin
    if(port_en_0 == 1 && wr_en == 1) //check enable signal and if write enable is ON
        ram[addr_in_0] <= data_in;
end

//always reading from the ram, irrespective of clock.
assign data_out_0 = port_en_0 ? ram[addr_in_0] : 'dZ;   
assign data_out_1 = port_en_1 ? ram[addr_in_1] : 'dZ;   

endmodule 

Test bench:
`timescale 1ns / 1ps

module dual_port_ram_tb;
parameter addr_width = 4;
parameter data_width = 8;
parameter depth = 16;
integer i;
        // Inputs
        reg clk;
        reg wr_en;
        reg [data_width-1:0] data_in;
        reg [addr_width-1:0] addr_in_0;
        reg [addr_width-1:0] addr_in_1;
        reg port_en_0;
        reg port_en_1;

        // Outputs
        wire [data_width-1:0] data_out_0;
        wire [data_width-1:0] data_out_1;

        // Instantiate the Unit Under Test (UUT)
        dual_port_ram uut (
                .clk(clk), 
                .wr_en(wr_en), 
                .data_in(data_in), 
                .addr_in_0(addr_in_0), 
                .addr_in_1(addr_in_1), 
                .port_en_0(port_en_0), 
                .port_en_1(port_en_1), 
                .data_out_0(data_out_0), 
                .data_out_1(data_out_1)
        );

 always
        #5 clk = ~clk;
initial begin
        clk = 1;
        addr_in_1 = 0;
        port_en_0 = 0;
        port_en_1 = 0;
        wr_en = 0;
        data_in = 0;
        addr_in_0 = 0;  
        #20;
        port_en_0 = 1;  
        wr_en = 1;
      for(i=1; i <= 16; i = i + 1) begin
            data_in = i;
            addr_in_0 = i-1;
            #10;
        end
        wr_en = 0;
        port_en_0 = 0;  
        port_en_1 = 1;  
        for(i=1; i <= 16; i = i + 1) begin
            addr_in_1 = i-1;
            #10;
        end
        port_en_1 = 0;
    end

endmodule




Comments

Popular posts from this blog

Number system

Realme 13+ specifications

Vivo Y300 Pro key specifications