由于英特尔® Quartus® Prime 软件版本 16.0 及更高版本出现问题,如果将 RAM 输出恢复到中间信号而不是输出端口,则可能会忽略"no_rw_check"的属性。英特尔 Quartus Prime 软件版本 15.1 及更早版本中不会出现此问题。
如果您有一个设计迁移到英特尔 Quartus Prime 软件 16.0 版本及更高版本,请在分析中查看报告,并合成 -> LPM_Parameter设置 - > RAM。如果使用"no_rw_check"属性,则参数READ_DURING_WRITE_MODE_MIXED_PORTS具有"请勿护理"的值。
下面的示例显示从 英特尔 Quartus Prime 软件 16.0 版本开始未检测到的属性"no_rw_check"代码:
LIBRARY ieee;
使用ieee.std_logic_1164.ALL;
实体 ram IS
端口(
时钟:IN STD_LOGIC;
数据:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
write_address:INTEGER 范围 0 到 31;
read_address:INTEGER 范围 0 到 31;
我们:在STD_LOGIC;
问:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)
);
END ram;
架构 rtl of ram IS
MEM IS 阵列(0 至 31)的STD_LOGIC_VECTOR(2 下托 0);
信号ram_block:MEM;
ATTRIBUTE ramstyle:string;
ram_block的 ATTRIBUTE Ramstyle:信号为"no_rw_check";
信号read_address_reg:整数范围为 0 至 31;
信号q_reg:STD_LOGIC_VECTOR(2 个 DOWNTO 0);
开始
流程(时钟)
开始
如果 (时钟事件和时钟 = "1"), 则
如果 (我们 = '1')
ram_block(write_address)
结束 IF;
read_address_reg
结束 IF;
从 英特尔 Quartus Prime 软件 16.0 版本开始未检测到属性"no_rw_check"缩放代码
------------------------------------------------------------------------------------
如果 (时钟事件和时钟 = "1"), 则
q_reg
结束 IF;
q
------------------------------------------------------------------------------------
最终过程;
END rtl;
要解决此问题,在
分配 - >设置 - >编译器设置 - >高级设置 (合成)
或
用以下代码替换上面剪切的代码,将 RAM 的输出信号作为输出端口,无需使用中间信号:
------------------------------------------------------------------------------------
如果 (时钟事件和时钟 = "1"), 则
q
结束 IF;
------------------------------------------------------------------------------------
此问题计划在英特尔 Quartus Prime 专业版软件的未来发行版中修复。