初始化存储器阵列的一种典型方法是在“初始”过程中分配初始值。
但是编译器抱怨我不能通过always_ff / always_comb / always_latch进程在“mem”上有两个驱动程序......
logic [15:0] mem [0:255];
initial
begin
mem = '{default: 128};
end
// Synchronous Write to RAM
always_ff @ (posedge sys_clkh)
begin
if(in_wr_enh)
mem[in_wr_adh] <= in_dth;
end
// Asynchronous Read from RAM
assign out_dth = mem[in_rd_adh];
如何解决此问题? 我不想以这种方式使用它:
logic [15:0] mem [0:255] = '{default: 128}
因为综合工具理解这一点的唯一方法就是将其置于初始过程中
答案 0 :(得分:0)
初始化这样的RAM仅用于使模拟看起来很好。在实际芯片上(无论是FPGA还是ASIC),RAM单元在上电时将具有未定义的值。为了对此进行建模,逻辑模拟器使用U
(在VHDL中)或X
(在Verilog中)值。
我建议不要初始化任何RAM,因为这可以隐藏设备从事先未使用显式值写入的单元格中读取的问题。如果您读取任何未定义的值,它们将通过您的设计传播,并且(希望)发出一个断言或者以其他方式使您的测试失败。
答案 1 :(得分:0)
如果目标是Xilinx FPGA,您可以在上电时预加载RAM内容。我建议使用Xilinx块内存生成器(在Vivado中的Customize IP下),它允许您指定要加载到内存中的init文件或填充内存位置。
如果使用预加载RAM的方法,要注意一件事 - 软复位后的行为与上电复位(重新加载FPGA位文件)后的行为不同,因为RAM没有重新初始化 - 在重置之前,你仍然会在RAM中有任何信息。如果您的系统支持软重置,您的设计需要考虑到这一点并模拟这两种情况。 (实际上,相同的条件适用于初始条件下的任何信号,这些信号仅在FPGA中支持,而不在ASIC中支持。当Xilinx鼓励人们使用初始条件而不是重置逻辑时,它倾向于掩盖这个问题)。
答案 2 :(得分:0)
唯一的方法是改变&#34; always_ff&#34;总是&#34;。