• 【【RAM的verilog 代码 + testbench】】


    RAM的verilog 代码 + testbench

    RAM.v

    //DUal ended RAM 
    module RAM #(
        parameter     WIDTH      =     8   ,
        parameter     DEPTH      =     16  ,
        parameter     ADD_WIDTH  =     clogb2(DEPTH) 
    )(
        input                       wr_clk         ,
        input                       rd_clk         ,
        input                       wr_en          ,
        input                       rd_en          ,
        input      [WIDTH-1 : 0 ]      din         ,
        input      [ADD_WIDTH-1 : 0]   wr_address  ,
        output reg [WIDTH-1 : 0 ]      dout        ,
        input      [ADD_WIDTH-1 : 0]   rd_address  
    );
    
    
    //==================================================================================\\
    //       define  parameter   and  internal   signal                                 \\
    //==================================================================================\\
    
    reg [WIDTH - 1 : 0 ] ram [DEPTH - 1 : 0] ; 
    
    
    
    
    
    //==================================================================================\\
    //                              next is  main code                                  \\
    //==================================================================================\\
    
    
    function integer clogb2  ;
    input [31:0] value  ;
    begin 
        value = value - 1 ;
        for(clogb2 = 0 ; value > 0 ; clogb2 = clogb2 + 1)
        value = value >> 1 ; 
    end
    endfunction 
    
    
    // write  
    always@(posedge wr_clk) 
    begin 
        if(wr_en) begin 
            ram[wr_address] <= din ;
        end
    end 
    
    //read 
    always@(posedge rd_clk) 
    begin 
        if(rd_en) begin 
            dout <= ram[rd_address] ;
        end
    end 
    endmodule 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    RAM_tb .v

    `timescale 1ns/1ps
    
    module RAM_tb #(
        parameter     WIDTH      =     8  ,
        parameter     DEPTH     =      8  ,
        parameter     ADD_WIDTH  =     3
      );
      reg                      wr_clk         ;
      reg                      rd_clk         ;
      reg                      wr_en          ;
      reg                      rd_en          ;
      reg     [7 : 0]          din            ;
      reg     [2 : 0]          wr_address     ;
      reg     [2 : 0]          rd_address     ;
      wire    [7: 0 ]          dout           ;
    
    
    
      RAM#(
           .WIDTH       ( WIDTH ),
           .DEPTH       ( DEPTH ),
           .ADD_WIDTH   ( ADD_WIDTH )
         )u_RAM(
           .wr_clk      ( wr_clk      ),
           .rd_clk      ( rd_clk      ),
           .wr_en       ( wr_en       ),
           .rd_en       ( rd_en       ),
           .din         ( din         ),
           .wr_address  ( wr_address  ),
           .dout        ( dout        ),
           .rd_address  ( rd_address  )
         );
    
    
    
    
    
    
      always     #10      wr_clk   =   ~wr_clk    ;
      always     #10      rd_clk   =   ~rd_clk    ;
    
      initial
        begin
    
          wr_clk     = 0 ;
          rd_clk     = 0 ;
          wr_address = 0 ;
          rd_address = 0 ;
          din        = 1 ;
    
          wr_en  =  0 ;
          rd_en  =  0 ;
    
    
          #10
           wr_en  =  1 ;
          rd_en  =  1 ;
    
          #10
           wr_en  =  0 ;
          rd_en  =  0 ;
    
          #10
           wr_en  =   1 ;
           rd_en  =   1 ; 
          repeat(7)
          begin
            @(posedge wr_clk)
             begin
    
               wr_address = wr_address +1 ;
               din = din +1 ;
    
             end
           end
          #10
    
    
           repeat(7)
           begin 
            @(posedge rd_clk)
             rd_address = rd_address+ 1 ;
           end
         end
       endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
  • 相关阅读:
    电脑软件:推荐一款非常实用的固态硬盘优化工具
    YOLOV8模型改进-添加CBAM注意力机制
    从Systrace看抖音Android Camera Bufferqueue渲染
    VsCode同时编译多个C文件
    Spring中AOP使用场景
    Unity中Shader的深度偏移Offset
    1089 不能被3整除的数
    Java多线程(5):CAS
    实现最简的内核模块
    第四章:Unix时间
  • 原文地址:https://blog.csdn.net/weixin_50965981/article/details/134099463