由于项目中关于厂商提供的温度-偏压曲线数据已经被同事放在ROM表了,我这边可用直接调用。 今天在仿真的时候,发现他的ROM表用的IP核是及时输出的,就是你地址给进去,对应地址的ROM数据就立马输出,没有延迟。 我打开他的IP核配置一看,他用的是Distributed Memory Generator。 我以前用的是Block Memory Generator是要延迟一拍的。所以,我立马进行了Distributed Memory Generator的测试。
1 ROM IP核配置 (Distributed Memory Generator)
IP核已生成 | 老规矩,查看如何例化 |
2 ModelSim仿真测试
源码
`timescale 1ns / 1ps
module lab_rom(
input wire clk,
input wire rst_n
);
//==================================================================
// Parameter define
//==================================================================
parameter MAX_ADDR = 32 - 1;
//==================================================================
// Internal Signals
//==================================================================
(* MARK_DEBUG="true" *) reg [4:0] a;
(* MARK_DEBUG="true" *) wire [15:0] spo;
//----------------------------- addra自增 -----------------------------
always @(posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
a <= 'd0;
end
else if(a == MAX_ADDR)begin
a <= 'd0;
end
else begin
a <= a + 1'b1;
end
end
//----------------------------- s_rom_32x16b例化 -----------------------------
s_rom_32x16b u1_rom_32x16b (
.a(a), // input wire [4 : 0] a
.spo(spo) // output wire [15 : 0] spo
);
仿真代码
`timescale 1ns/1ps
module tb_lab_rom (); /* this is automatically generated */
// clock
reg clk;
initial begin
clk = 1'b0;
forever #(10) clk = ~clk;
end
// asynchronous reset
reg rst_n;
initial begin
rst_n <= 1'b0;
#10
rst_n <= 1'b1;
end
// (*NOTE*) replace reset, clock, others
parameter MAX_ADDR = 32 - 1;
lab_rom #(.MAX_ADDR(MAX_ADDR)) inst_lab_rom (.clk(clk), .rst_n(rst_n));
endmodule
约束文件
create_clock -period 20.000 [get_ports clk]
set_property PACKAGE_PIN N18 [get_ports clk]
set_property PACKAGE_PIN T12 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
仿真结果
从仿真来看,确实用Distributed Memory Generator生成的ROM IP核是无延迟的。
3 在线调试
在线调试的ILA步骤我这里就不赘述了。 我直接给出结果。
总得来讲,Distributed Memory Generator,虽然深度必须是16的倍数,但其生成的ROM IP核输出是无延迟的,真香!