Altera FPGA开发中如何使用 SignalTap 观察wire与reg变量值

在 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 的语言模板。

Altera FPGA开发中如何使用 SignalTap 观察wire与reg变量值

在 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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年3月8日 15:58
下一篇 2021年6月22日 21:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注