问题描述
一般问题描述:
当我的黑盒输出未知(“U”)或未定义(“X”)时,错误报告块接收到有效位设置为true的数据字,但数据处于不确定状态(“不关心“)状态。另外,错误说明:”不允许这样的转换,因为不允许布尔控制信号进入不确定状态。“
发生此错误的原因是未知的“U”或未定义的“X”状态在Simulink中转换为NaN(非数字),并且System Generator中的某些块无法处理NaN。
解决/修复方法
设计中的所有信号都应初始化,原因有两个:
– 确保它们都以已知状态开始;
– 当设计在硬件中运行时,所有信号都初始化为特定值。
例
signal my_signal:std_logic:=’0′;
使用System Generator块,您还可以在Simulink中创建一个可配置的子系统,该子系统在生成时看起来像一根线,但是移除了NaN以进行仿真。
您可以使用工具库中的Indeterminate Probe(!def)块来检查“X”或NaN。然后,您可以使用Indeterminate Probe的输出来驱动MUX的选择线,然后使用原始输入和常量之间的选择来驱动MUX选择。
您还可以在设计中添加清洁器,以清除VHDL输出中的所有“U”或“X”状态。
警告 :如果由于某种原因在调试代码时需要找到“U”或“X”,这可能会有潜在危险。
下面说明了具有未知“U”输出的原始源代码,该输出导致System Generator for DSP生成错误:
库IEEE;
使用IEEE.std_logic_1164.all;
使用IEEE.numeric_std.all;
实体myreg是
port(d:in std_logic;
q:out std_logic;
ce:在std_logic;
clk:在std_logic中);
结束myreg;
myreg的架构行为是
开始
REG_Process:process(d,clk,ce)
变量状态:std_logic:=’U’;
开始
if(ce =’1’和rising_edge(clk))然后
state:= d;
万一;
q <=状态;
结束进程REG_Process;
结束行为;
以下是带有清除组件的更新代码,该组件删除“U”或“X”状态。此代码在设置用于仿真的清洁组件并将其替换为生成线时实例化用于生成的原始组件。
库IEEE;
使用IEEE.std_logic_1164.all;
使用IEEE.numeric_std.all;
实体清洁工是
通用的(Sim:bit:=’0’);
port(dirty:在std_logic中;
clean:out std_logic);
清洁工;
清洁工的建筑行为是
开始
synthModel:
if(Sim =’0’)生成
PassThrough_Process:进程(脏)
开始
干净<=脏;
结束进程PassThrough_Process;
结束生成;
simModel:
if(Sim =’1’)生成
Cleaning_Process:进程(脏)
开始
if(dirty =’U’)然后
干净<=’0′;
elsif(dirty =’L’)然后
干净<=’0′;
其他
干净<=脏;
万一;
结束过程Cleaning_Process;
结束生成;
结束行为;
库IEEE;
使用IEEE.std_logic_1164.all;
使用IEEE.numeric_std.all;
实体my_reg_w_adapter是
port(ce:in std_logic;
clk:在std_logic中;
d:在std_logic中;
q:out std_logic);
结束my_reg_w_adapter;
my_reg_w_adapter的架构结构是
组件清洁剂
通用的(Sim:bit:=’0’);
port(dirty:在std_logic中;
clean:out std_logic);
最终组件;
组件myreg
port(ce:in std_logic;
clk:在std_logic中;
d:在std_logic中;
q:out std_logic);
最终组件;
signal ce_net:std_logic;
信号clk_net:std_logic;
信号d_net:std_logic;
signal clean_q_net:std_logic;
信号q_net:std_logic;
开始
ce_net <= ce;
clk_net <= clk;
d_net <= d;
q <= clean_q_net;
C:清洁
– synopsys translate_off
通用映射(Sim =>’1’)
– synopsys translate_on
端口映射(dirty => q_net,
clean => clean_q_net);
R:myreg
端口映射(ce => ce_net,
clk => clk_net,
d => d_net,
q => q_net);
结构;
没有回复内容