VHDL测试平台与验证特性详解
立即解锁
发布时间: 2025-08-16 01:28:54 阅读量: 2 订阅数: 11 


VHDL设计指南:从入门到精通
### VHDL测试平台与验证特性详解
在VHDL设计验证过程中,有许多重要的特性和技巧可以帮助我们更高效地完成验证工作。本文将详细介绍VHDL中的外部名称引用、强制和释放赋值以及嵌入式PSL等关键内容。
#### 1. 外部名称引用
在设计单元包中的对象,虽然不嵌套在设计层次结构中,但被认为嵌套在包含该包的库中。因此,区域名称链从库名称开始,经过顶级包名称和任何嵌套包名称,最终指向被引用的对象。
包路径名的形式类似于绝对路径名,但以“@”符号开头。其语法规则如下:
```plaintext
package_pathname ⇐ @ library_identifier . { package_identifier . } object_identifier
```
例如,对于以下在工作库中分析的包声明和包体:
```vhdl
package p1 is
...
end package p1;
package body p1 is
...
package p2 is
signal s : bit;
end package p2;
...
end package body p1;
```
我们可以使用以下外部名称来引用信号:
```vhdl
<<signal @work.p1.p2.s : bit>>
```
需要注意的是,VHDL - 87、 - 93和 - 2002版本不允许使用外部名称。
#### 2. 强制和释放赋值
在验证设计时,我们常常需要覆盖信号在正常设计操作中分配的值,并强制赋予一个不同的值。这样做的原因主要有两个:一是通过强制值到一个通常需要复杂初始化序列才能达到的状态,从而快速设置测试场景,显著减少验证时间;二是向设计中注入错误值,以确保设计能够检测到错误或做出适当的响应。
VHDL提供了一种称为强制赋值的方式来实现这一目的。简单强制赋值的语法规则如下:
```plaintext
signal_assignment_statement ⇐
[ label : ] name <= force [ in I out ] expression ;
```
这是一个在测试平台的进程中编写的顺序赋值语句。其效果是引发一个增量周期,并强制指定信号在该增量周期内采用表达式的值,而不管任何正常信号赋值给该信号的值。
当我们不再需要强制信号时,可以执行释放赋值。释放赋值的语法规则如下:
```plaintext
signal_assignment_statement ⇐
[ label : ] name <= release [ in I out ] ;
```
这会引发另一个增量周期,信号变为活跃状态。但由于信号不再被强制,其值将由其源的当前值以正常方式确定。
下面通过一个示例来说明强制和释放赋值的应用:
```vhdl
verify_state_recovery : process is
use work.control_pkg.all;
alias clk is <<signal duv.clk : std_ulogic>>;
alias current_state is
<<signal duv.control.current_state : state_type>>;
begin
...
-- inject corrupt state
wait until falling_edge(clk);
current_state <= force illegal_state_12;
wait until falling_edge(clk);
current_state <= release;
-- monitor recovery activity
...
end process verify_state_recovery;
```
对于端口,我们需要区分驱动值和有效值。VHDL允许我们通过在赋值中包含强制模式来独立强制信号或端口的驱动值和有效值。例如:
```vhdl
duv_bus <= force out "ZZZZZZZZ"; -- 强制驱动值
duv_bus <= force in "XXXXXXXX"; -- 强制有效值
```
相应地,释放强制驱动值和有效值的语句如下:
```vhdl
duv_bus <= release out;
duv_bus <= release in;
```
如果在强制或释放赋值中省略强制模式(out或in),则会应用默认强制模式。对于模式为in的端口和信号参数以及显式声明的信号,默认强制模式为in,即强制有效值;对于模式为out、inout或buffer的端口和信号参数,默认强制模式为out,即强制驱动值。
除了简单的强制赋值,我们还可以使用条件和选择强制赋值。条件强制赋值的语法规则如下:
```plaintext
conditional_force_assignment ⇐
[ label : ]
name <= force [ in I out ]
expression when condition
{ else expression when condition }
[ else expression ] ;
```
选择强制赋值的语法规则如下:
```plaintext
selected_signal_assignment ⇐
[ label : ]
with expression select [ ? ]
name <= force [ in I out ]
{ expression when choices , }
expression when choices ;
```
以下是一个条件强制赋值的示例:
```vhdl
alias dut_d_bus is
<<signal dut.d_bus:std_ulogic_vector(15 downto 0)>>;
...
for test_
```
0
0
复制全文
相关推荐










