Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
Concurrency VHDL断言-并发语句_Concurrency_Vhdl_Assert - Fatal编程技术网

Concurrency VHDL断言-并发语句

Concurrency VHDL断言-并发语句,concurrency,vhdl,assert,Concurrency,Vhdl,Assert,我正在尝试使用VHDL断言。在我的设计中,我直接在DUT中编写了assert语句,因为我想监视内部信号。由于我的断言与指令同时进行,模拟器几乎在每次输入更改时都会生成一个报告 下面我给你一个简单的工作示例(一个简单的加法器)。这不是我的实际设计,只是我问题的一个例证 如何修改代码,使断言不会在不需要的时间触发?这里没有合成约束 提前谢谢你 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entit

我正在尝试使用VHDL断言。在我的设计中,我直接在DUT中编写了assert语句,因为我想监视内部信号。由于我的断言与指令同时进行,模拟器几乎在每次输入更改时都会生成一个报告

下面我给你一个简单的工作示例(一个简单的加法器)。这不是我的实际设计,只是我问题的一个例证

如何修改代码,使断言不会在不需要的时间触发?这里没有合成约束

提前谢谢你

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity Full_Adder is
   port( X, Y, Cin : in std_logic;
         sum, Cout : out std_logic);
end Full_Adder;
 
architecture bhv of Full_Adder is

signal s_sum : std_logic:='0'; -- to be used in the assert
signal s_Cout : std_logic:='0'; -- to be used in the assert

begin

   s_sum <= (X xor Y) xor Cin;
   s_Cout <= (X and (Y or Cin)) or (Cin and Y);
   sum<=s_sum;
   Cout<=s_Cout;

   assert (s_sum =((X xor Y) xor Cin)) report "Erreur de somme" severity note;
   assert (s_Cout = ((X and (Y or Cin)) or (Cin and Y))) report "Erreur de retenue" severity note;

end bhv;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.std_logic_arith.all;
实体全加器是
端口(X、Y、Cin:std_逻辑中;
求和,Cout:out标准逻辑);
端部全加器;
全加器的结构bhv是
信号s_和:标准逻辑:='0';--在断言中使用
信号输出:标准逻辑:='0';--在断言中使用
开始
苏森,
Cout=>Cout
);
过程
开始

A完全清楚地说,问题不在于断言不起作用,而是它们被触发的次数比您预期的要多得多。对吗?如果是这样的话,试着在问题中更清楚地说明这一点。你是对的。我编辑了我的问题,希望现在更清楚。你需要考虑s_sum和s_Cout的信号更新中的增量周期延迟。对于s_和:
assert s_和=((X'delayed(0ns)xor Y'delayed(0ns))xor Cin'delayed(0ns))报告“严重性错误”注释
进程开始等待s_和;断言s_sum=(X xor Y xor Cin)报告“严重性错误”说明;结束过程异或是可交换的(不需要括号)。条件在语法上是可区分的,不需要外括号。并发断言语句被细化为包含顺序断言语句的被动进程语句。添加增量周期延迟效果良好。但是
wait on
指令不是一个有效的选项:如果输入的更改没有更改输出,则不会评估断言。最后一件不能正常工作的事情(但我想我必须接受它)是在初始化时,当断言被触发时,它不应该被触发。无论如何,非常感谢!!
Library IEEE;
USE IEEE.Std_logic_1164.all;
entity tb_fulladder is
end tb_fulladder;
 
architecture behavioral of tb_fulladder is
 component Full_Adder
   port( 
   X, Y, Cin : in std_logic;  
  sum, Cout : out std_logic
  );  
 end component; 

 signal A,B,Cin: std_logic:='0';
 signal S,Cout: std_logic;

begin   
 structural_adder: Full_Adder port map 
   (
    X => A,
    Y => B,
    Cin => Cin,
    sum => S,
    Cout => Cout 
   );
   
process
  begin
   A <= '0';
   B <= '0';
   Cin <= '0';
   wait for 100 ns;
   A <= '0';
   B <= '0';
   Cin <= '1';
   wait for 100 ns;   
   A <= '0';
   B <= '1';
   Cin <= '0';
   wait for 100 ns;
   A <= '0';
   B <= '1';
   Cin <= '1';
   wait for 100 ns;
   A <= '1';
   B <= '0';
   Cin <= '0';
   wait for 100 ns;
   A <= '1';
   B <= '0';
   Cin <= '1';
   wait for 100 ns;
   A <= '1';
   B <= '1';
   Cin <= '0';
   wait for 100 ns;   
   A <= '1';
   B <= '1';
   Cin <= '1';
   wait for 100 ns;   
  end process;
      
end behavioral;