<一>创建工程

       创建工程在此略过。

<二>基本代码

1、创建一个Verilog modual代码如下:

module main(
         input clk,
     input rsta,
     input wea,
     input [3 : 0] addra,
     input [7 : 0] dina,
     output [7 : 0] douta,
     input rstb,
     input web,
     input [3 : 0] addrb,
     input [7 : 0] dinb,
     output [7 : 0] doutb
    );
device1 mydevice(
        .clka(clk),
    .rsta(rsta),
    .wea(wea),
    .addra(addra),
    .dina(dina),
    .douta(douta),
    .clkb(clk),
    .rstb(rstb),
    .web(web),
    .addrb(addrb),
    .dinb(dinb),
    .doutb(doutb)
    );
    
endmodule

代码中元件例化了一个True Dual Port RAM。

2、写测试代码

module mainTest;

    // Inputs
    reg clk;
    reg rsta;
    reg wea;
    reg [3:0] addra;
    reg [7:0] dina;
    reg rstb;
    reg web;
    reg [3:0] addrb;
    reg [7:0] dinb;

    // Outputs
    wire [7:0] douta;
    wire [7:0] doutb;

    // Instantiate the Unit Under Test (UUT)
    main uut (
        .clk(clk), 
        .rsta(rsta), 
        .wea(wea), 
        .addra(addra), 
        .dina(dina), 
        .douta(douta), 
        .rstb(rstb), 
        .web(web), 
        .addrb(addrb), 
        .dinb(dinb), 
        .doutb(doutb)
    );

    initial begin
        // Initialize Inputs
        clk = 0;
        rsta = 0;
        wea = 1;
        addra = 1;//这里为什么是1在下面有解释
        dina = 0;
        rstb = 0;
        web = 0;
        addrb = 0;
        dinb = 0;

        // Wait 100 ns for global reset to finish
        
        // Add stimulus here

    end
   always #0.001 clk = ~clk;
    always @(negedge clk)
      begin 
         addra = addra + 1;
          addrb = addrb + 1;
          dina = dina + 2;
      end
endmodule

<三>执行结果

在结果图中,前面的100ps数据并没有改变(原因有待进一步查明);

因为web=0一直不变,所以port B是禁止写数据的,而addrb总是比addra小1,这样做的目的就是为了利用port B 的doutb来检测port A在上一次写入的数据是不是正确的写入,即doutb总是显示的port A 在clk上一次的上升沿写入的数据。