在 FPGA 程序调试时,我们除了仿真还经常的会用到 SignalTap 进行板级调试,其可以真实有效的反应某些变量的变化,方便我们理解内在跳转,方便 Debug 的运行。SignalTap 需要制定时钟,根据需求进行选择,其采样遵循奈奎斯特因采样定律。
我们在 Debug 中有时会经常遇到这样的情况,在 SignalTap 中并不能观察到所有的变量值。有些变量添加进入面板后会变红,这就表示 SignalTap 抓取不到此数值。出现这一现象的原因是,综合器在综合时对一些变量进行了优化,所以就显示不出来了。下文将针对两种变量类型,wire 和 reg 来分别讲述如何让其正常的显示出来。这一部分的知识其实很简单就是,基本思想就是使用综合属性 Synthesis Attribute 来控制综合时的一些优化。
在介绍如何使用 SignalTap 观察 wire 与 reg 变量值之前,先来看一下 Quartus II 中自带的 language template。
一、language template 介绍
在 Edit -> Insert Template 下可以看到 Verilog HDL、SystemVerilog、VHDL、AHDL、Quartus II TCL、TCL 的语言模板。

在 Verilog HDL 下面,可以找到基本的逻辑操作符、基本语言结构,甚至是完整的设计。
其中的基本语言结构和操作符可用来在编程时参考,而完整的设计作为自学语言的实例是再好不过了。这些完整的设计不仅仅是语法上结构完整,其书写格式、参数化、注释都很标准,从中可以学到许多优秀的编码风格和特殊功能的描述方法。
比如,双端口 RAM 的描述中就有关于读写同时操作时,读取返回的值是新值还是旧值的区别,采用阻塞和非阻塞赋值就可以在综合后的代码中得到这样的差别。
同样,在其他 EDA 工具中也有类似的语言模板,都可以作为我们提高编码水平的助手。
二、如何使用 SignalTap 观察 wire 与 reg 变量值
2.1 wire 型变量
有关于变量的综合属性这一块也可以在 Quartus 中的 language template 中查看。wire 型变量的综合属性在 Quartus 13 中的 template 中显示如下,其主要命令为 keep 命令。Quartus 软件中给出了相关的介绍。
// Prevents Quartus II from minimizing or removing a particular // signal net during combinational logic optimization. Apply // the attribute to a net or variable declaration. (* keep *) wire <net_name>; (* keep *) reg <variable_name>;
其主要是为了防止相关 wire 型变量在综合时被优化或者是被省略。
总结出 wire 型变量的综合属性配置方法有以下两种:
1. (* keep * ) wire <net_name>; 2. wire <net_name>/* synthesis keep */;
其中,第一种写法为 verilog-2001 标准,第二种为之前的标准,两者可兼容。需要注意的是在采用第二种写法时,注释部分一定要写在分号之前。
2.2 reg 型变量
reg 型变量的综合属性在 Quartus 13 中的 template 中显示如下,其主要命令为 preserve 和 noprune 命令。
// Prevents Quartus II from optimizing away a register. Apply // the attribute to the variable declaration for an object that infers // a register. (* preserve *) <variable_declaration>; (* preserve *) module <module_name>(...);
防止优化掉某一个 reg 型的部分或整体,可以用于某一个特定的变量也可以用于一个 module 中的所有 reg 型变量。
// Prevents Quartus II from removing or optimizing a fanout free register. // Apply the attribute to the variable declaration for an object that infers // a register. (* noprune *) <variable_declaration>;
防止优化掉一个没有扇出的 reg 型变量,有可能是无关量,有可能是中间量。
总结出 reg 型变量综合属性配置的方法有以下几种。
1. (* noprune *) reg <variable>; 2. (* preserve *) reg <variable>; 3. (* preserve *) module <module_name>(...); 4. reg <variable>/* synthesis noprune */; 5. reg <variable>/* synthesis preserve */; 6. module <module_name>(...)/* synthesis preserve */;
同样有两种写法,是两种标准,可任意选择一种觉得方便的。同样注意的是分号的位置。
另外,对于 reg 信号则加/*synthesis noprune*/ 或者 /* synthesis preserve */,两者的不同之处在于:
/*synthesis noprune*/避免 Quartus II 优化掉没 output 的 reg。
/*synthesis preserve*/避免 Quartus II 将 reg 优化为常数,或者合并重复的 reg。
扫码关注尚为网微信公众号

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/929.html