<一>创建工程
创建工程在此略过。
<二>基本代码
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上一次的上升沿写入的数据。