【发布时间】:2018-02-06 02:40:50
【问题描述】:
我的 VHDL 代码中有一个断言,用于验证通过我的组件实体传递的泛型。断言的严重性设置为 FAILURE,因为如果泛型被滥用,我想退出模拟。当使用 Active-HDL(实际上是任何版本,但我专门使用版本 12-14a)进行仿真时,当泛型被滥用并且仿真在执行任何其他操作之前退出时,断言会被命中。然而,当使用 ModelSim DE(我只尝试过 10.6c,32 位)进行模拟时,断言不是要评估的第一件事,并且对于与值相关的不同数组长度的信号分配会出现不同的错误泛型(这就是断言存在的原因)。这是我的 MCVE:
example.vhd:
library ieee;
use ieee.std_logic_1164.all;
entity example is
generic
(
INPUT_LEN : integer := 4;
OUTPUT_LEN : integer := 5
);
port
(
my_input : in std_logic_vector(INPUT_LEN-1 downto 0);
my_output : out std_logic_vector(OUTPUT_LEN-1 downto 0)
);
end entity example;
architecture rtl of example is
begin
-- We want this evaluated first.
assert (INPUT_LEN = OUTPUT_LEN)
report "INPUT_LEN and OUTPUT_LEN must be equal!"
severity FAILURE;
-- This is actually what is evaluated first.
my_output <= my_input;
end architecture rtl;
如您所见,my_output 和 my_input 受泛型值的影响,我希望断言首先发生,以便将有用的错误消息打印到控制台,而不是当前的 @ 987654326@.
我使用以下两个 ModelSim 命令进行编译和仿真:
vcom -work work example.vhd
vsim -c -lib work example
我的问题是,是否有针对 vsim 的指令强制 ModelSim 先评估断言? 或者更广泛地说,在执行任何其他操作之前会查找和评估断言的命令? 似乎 Active-HDL 默认会执行此操作,但 ModelSim 不会...我查看了 vsim 的文档,并尝试了 -immedassert 标志,但这并没有改变任何东西。
我还在使用在很多不同地方使用的非常旧的代码(显然比我的 MCVE 复杂得多),所以最好的解决方案不是是修改源代码。
感谢您的帮助。
【问题讨论】:
-
并发语句彼此异步执行。根据执行顺序是不可移植的,SystemVerilog 标志将无济于事。包括为并发语句详细说明的所有过程都在初始化期间执行,执行顺序在详细说明期间定义。不能保证依靠执行顺序来生成通用常量不匹配的特定消息。在测试台中为两个泛型使用一个值,使用在仿真前检查的命令文件(Modelsim 不支持 VHPI,回调将在进程之前执行)。
-
这不是minimal reproducible example 没有通用常量的默认表达式,很容易修复。如果您颠倒 MCVe 中两个并发语句(断言语句和信号赋值语句)的顺序,您可能会看到您想要的结果。这是否适用于所有 Modelsim 详细模型是另一个问题。 ghdl 具有所需的执行顺序,而您的 MCVe 未更改(正如您为 Active-HDL 报告的那样)。
-
我认为如果不修改源代码就无法做到这一点。至少,如果断言在源代码中。理想情况下,代码不应该依赖于特定于编译器的怪癖:如果确实如此,则可以将其视为编码反模式。
-
@user1155120 实体中的语句是否比架构中的语句具有更高的执行优先级?如果是这样,可以尝试将断言移动到实体声明中。
-
@Paebbels - 没有优先级,所有进程都是并发的。作为实体语句部分元素找到的被动过程的顺序将取决于实现并且也是不可移植的。