Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vhdl 模拟时首先计算断言_Vhdl_Modelsim - Fatal编程技术网

Vhdl 模拟时首先计算断言

Vhdl 模拟时首先计算断言,vhdl,modelsim,Vhdl,Modelsim,我的VHDL代码中有一个断言,用于验证通过组件实体传递的泛型。断言的严重性设置为失败,因为如果泛型被误用,我想退出模拟。当使用活动HDL(实际上是任何版本,但我特别使用了版本12-14a)进行模拟时,当泛型被误用并且模拟在执行任何其他操作之前退出时,会命中断言。但是,当使用ModelSim DE(我只尝试了10.6c,32位)进行模拟时,assert不是第一个要评估的对象,不同数组长度的信号分配会出现不同的错误,与泛型的值有关(这就是assert存在的原因)。这是我的MCVE: 示例.vhd:

我的VHDL代码中有一个断言,用于验证通过组件实体传递的泛型。断言的严重性设置为失败,因为如果泛型被误用,我想退出模拟。当使用活动HDL(实际上是任何版本,但我特别使用了版本12-14a)进行模拟时,当泛型被误用并且模拟在执行任何其他操作之前退出时,会命中断言。但是,当使用ModelSim DE(我只尝试了10.6c,32位)进行模拟时,assert不是第一个要评估的对象,不同数组长度的信号分配会出现不同的错误,与泛型的值有关(这就是assert存在的原因)。这是我的MCVE:

示例.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;
ieee库;
使用ieee.std_logic_1164.all;
实体示例是
通用的
(
输入长度:整数:=4;
输出长度:整数:=5
);
港口
(
my_输入:在标准逻辑向量中(输入_LEN-1向下至0);
my_输出:输出标准逻辑向量(输出长度-1向下至0)
);
终端实体示例;
示例的体系结构rtl是
开始
--我们希望先对其进行评估。
断言(输入长度=输出长度)
报告“输入长度和输出长度必须相等!”
严重故障;
--这实际上是首先评估的。

my_outputVHDL是一种强类型语言。我不确定让您首先运行断言的
Modelsim
的构造


您可以尝试的只是类型转换my_输出您可以通过将其放入进程来实现顺序处理。例如:

library ieee;
use ieee.std_logic_1164.all;

entity example is
    generic (
        INPUT_LEN : integer := 5;
        OUTPUT_LEN : integer := 6);
    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;

architecture rtl of example is
begin
    assign_my_output: process(my_input) begin
        assert (INPUT_LEN = OUTPUT_LEN)
            report "INPUT_LEN and OUTPUT_LEN must be equal!"
            severity FAILURE;

         my_output <= my_input;
    end process;
end architecture rtl;
ieee库;
使用ieee.std_logic_1164.all;
实体示例是
一般的(
输入长度:整数:=5;
输出长度:整数=6);
港口(
my_输入:在标准逻辑向量中(输入_LEN-1向下至0);
my_输出:输出标准逻辑向量(输出从1向下到0);
终端实体;
示例的体系结构rtl是
开始
分配我的输出:进程(我的输入)开始
断言(输入长度=输出长度)
报告“输入长度和输出长度必须相等!”
严重故障;

my_output所有并发语句都在进程语句或进程语句和块语句中详细说明。这两个并发语句,即信号赋值和断言,没有保证的执行顺序。依赖于实现定义的外观排序会导致不可移植的设计描述

断言仍然可以排序。在精化过程中可以得到断言

这可以通过添加(在本例中)一个函数来证明,该函数返回一个布尔值作为从未使用过的对象的初始值(并且在合成过程中会被消除):

第20行在函数is\u it\u safe中

Modelsim的排序将保持不变,因为对象是在模拟初始化之前详细描述的(此时会发生一个或另一个错误)。参见IEEE标准1076-2008 14.4声明的详细说明,14.4.2.5对象声明和14.7模型的执行,14.7.5.2初始化

这里的想法是建立一个断言的有序单次执行,该断言最初是一个并发语句(详细说明为一个没有敏感度列表的进程和一个没有子句的最终等待语句,请参见11.5并发断言语句)

注:到目前为止,没有答案回答了Modelsim中如何影响流程执行顺序的狭隘问题

不能命令并发语句执行。在模拟开始时(14.7.5.2)暂停之前执行的所有过程列表的顺序应为实现定义且不可移植。原来的海报已经证明了这一点

在精化过程中使用的函数中移动断言或提供新副本可以保证在初始化过程中在任何赋值语句之前执行断言语句

还请注意,测试相同类型的两个常量值相等性的断言可以被视为一种反模式,正如JHBonarius所评论的。从编程中采用的一种修复方法,它与硬件描述关系不大,只在缺少标准化错误消息时产生特定消息

VHDL将在原始代码中捕获错误,尽管需要熟悉VHDL或工具实现


通过函数中提供对象值的断言,可以消除并发断言语句。

并发语句彼此异步执行。取决于执行顺序是不可移植的,SystemVerilog标志将没有帮助。所有进程,包括为并发语句精心设计的进程,都是在初始化期间执行的,执行顺序是在精心设计期间定义的。指望执行顺序生成泛型常量不匹配的特定消息是无法保证的。在测试台中为两个泛型使用一个值,使用模拟前检查的命令文件(Modelsim不支持VHPI,回调将在进程之前执行)。这不是一个没有通用常量默认表达式的函数,易于修复。如果颠倒MCVe中两个并发语句(断言语句和信号赋值语句)的顺序,您可能会看到所需的结果。这是否能转化为所有模型是另一个问题。ghdl在MCVe保持不变的情况下具有所需的执行顺序(正如您报告活动HDL时所述)。我认为如果不修改源代码,您无法做到这一点。至少,如果断言在源代码中。理想情况下,代码永远不应依赖于编译器特定的怪癖:如果它依赖于编译器特定的怪癖,则可以将其视为编码反模式。@user1155120在实体中的语句的执行优先级高于体系结构中的语句?如果是这样,可以尝试将断言移动到实体声明中。@Paebbels-No pri
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
    function is_it_safe return boolean is
    begin
        assert (INPUT_LEN = OUTPUT_LEN)
          report "INPUT_LEN and OUTPUT_LEN must be equal!"
          severity FAILURE;
        return TRUE;
    end function;
    constant safe:    boolean := is_it_safe;
begin

    -- We want this evaluated first
    assert (INPUT_LEN = OUTPUT_LEN)
      report " ORIGINAL INPUT_LEN and OUTPUT_LEN must be equal!"
      severity FAILURE;

  -- This is actually what is evaluated first.
  my_output <= my_input;

end architecture rtl;
ghdl -a example.vhdl
ghdl -e example
ghdl -r example
example.vhdl:20:9:@0ms:(assertion failure): INPUT_LEN and OUTPUT_LEN must be equal!
./example:error: assertion failed
./example:error: error during elaboration