Vhdl 与Verilog';s事件类型和事件触发器->;事件a;

Vhdl 与Verilog';s事件类型和事件触发器->;事件a;,vhdl,verilog,Vhdl,Verilog,如何用VHDL编写以下代码 `timescale 1ns/10ps module tb; event event_a; initial begin #20 ->event_a; #30 ->event_a; #90 ->event_a; #100; $stop; end always @(event_a) begin $display("hello word (%t)"); en

如何用VHDL编写以下代码


`timescale 1ns/10ps

module tb;

  event event_a;

  initial begin
    #20  ->event_a;
    #30  ->event_a;
    #90  ->event_a;

    #100;
    $stop;
  end


always @(event_a) begin
    $display("hello word (%t)");
end

endmodule
以下是迄今为止我在VHDL中尝试的内容:

library STD;
library IEEE;              
use IEEE.std_logic_1164.all;
use STD.textio.all;         
use IEEE.std_logic_textio.all;    

-- VHDL PSEUDO-CODE FOR WHAT I WANT TO DO IN VHDL INSTEAD OF VERILOG
entity tb is
end entity;

architecture sim of tb is
   event_a : event_type;   -- HOW TO DO THIS IN VHDL???
begin

    process
    begin
         ->event_a after 20 ns;  -- HOW TO DO THIS IN VHDL???
         ->event_a after 30 ns;
         ->event_a after 90 ns;
  
         wait; --Wait until simulation finishes
    end process;

    process(event_a)   -- HOW TO DO THIS IN VHDL???
        variable L : line;
    begin
        write(L, string'("hello");
        WriteLine(L, output);
    end process;

end architecture;

-- BEEEP: SYNTAX ERROR BECAUSE WRONG SYNTAX...

VHDL中没有与Verilog事件等效的构造。然而,VHDL确实有一个内置的信号属性,使人们能够模拟Verilog事件。此属性是“事务”;它是一种信号,每次对该信号进行赋值时都会进行切换(无论赋值是否改变该信号的值)

因此,以正常方式声明一个信号(您喜欢的任何类型):

signal event_a : boolean := true;
(您不需要特别初始化它。)然后,每次您想要模拟Verilog
->
操作符时,您都可以在信号上驱动一些值(任何值):

event_a <= true;
您不必费心处理
'事务
,只需切换信号(在该信号上创建一个事件,从而使
'事件
信号属性为true)。不过,使用
“事务”
稍微好一点,因为您不必跟踪信号的值;每次都可以指定相同的值


顺便说一下,我在VHDL中没有在之后使用,因为信号分配的行为很像Verilog中的非阻塞分配。如果我在没有修改延迟值的情况下使用
after
,我将在20、30和90纳秒时触发进程,而不是在20、50和140纳秒时触发进程(我认为这是您所追求的)。换言之,这:

wait for 20 ns; event_a <= true;
wait for 30 ns; event_a <= true;
wait for 90 ns; event_a <= true;
鉴于:

event_a <= true after 20 ns;
event_a <= true after 30 ns;
event_a <= true after 90 ns;

event\u aVHDL中没有与Verilog事件等效的构造。然而,VHDL确实有一个内置的信号属性,使人们能够模拟Verilog事件。此属性是“事务”
;它是一种信号,每次对该信号进行赋值时都会进行切换(无论赋值是否改变该信号的值)

因此,以正常方式声明一个信号(您喜欢的任何类型):

signal event_a : boolean := true;
(您不需要特别初始化它。)然后,每次您想要模拟Verilog
->
操作符时,您都可以在信号上驱动一些值(任何值):

event_a <= true;
您不必费心处理
'事务
,只需切换信号(在该信号上创建一个事件,从而使
'事件
信号属性为true)。不过,使用
“事务”
稍微好一点,因为您不必跟踪信号的值;每次都可以指定相同的值


顺便说一下,我在VHDL中没有在之后使用,因为信号分配的行为很像Verilog中的非阻塞分配。如果我在没有修改延迟值的情况下使用
after
,我将在20、30和90纳秒时触发进程,而不是在20、50和140纳秒时触发进程(我认为这是您所追求的)。换言之,这:

wait for 20 ns; event_a <= true;
wait for 30 ns; event_a <= true;
wait for 90 ns; event_a <= true;
鉴于:

event_a <= true after 20 ns;
event_a <= true after 30 ns;
event_a <= true after 90 ns;

event\VHDL使用事件驱动模拟器,其中信号更新导致值的变化,从而导致事件。IEEE Std 1076-2008 14.7.3.4信号更新“如果更新信号导致该信号的当前值发生变化,则称信号上发生了事件,…”过程响应事件恢复执行。所以基本上,当你想要触发一个事件时,你只需要一直反转一个信号的值。。。sig某些值发生变化的信号。VHDL使用事件驱动模拟器,在该模拟器中,信号更新导致值发生变化,从而导致事件。IEEE Std 1076-2008 14.7.3.4信号更新“如果更新信号导致该信号的当前值发生变化,则称信号上发生了事件,…”过程响应事件恢复执行。所以基本上,当你想要触发一个事件时,你只需要一直反转一个信号的值。。。sig某些信号的值发生变化。您会注意到四个
hello
输出中的一个在时间=0时显示。这是由于初始化(IEEE Std 1076-2008 14.7.5.2)导致的,其中每个进程执行直到挂起,这里是从进程敏感度列表导出的最后一个隐式等待语句。进程在wait语句(10.2 wait语句)中暂停和恢复。使用模拟时间限定流程中顺序语句的执行,或者在这些顺序语句之前使用显式等待语句代替流程敏感度列表,以防止在时间0执行。
event\u a您是对的。学童错误。
实际上只会触发一个事件-一个在90纳秒
不,您将得到三个事件。在投影输出波形中,任何模拟时间只有一个条目。在不同的时间有不同的顺序和顺序。在引用部分之前的物理文本中,抽象文本和时间单位之间缺少空格。请参阅IEEE Std 1076-2008 15.3词汇元素、分隔符和分隔符“标识符或抽象文字与相邻标识符或抽象文字之间至少需要一个分隔符”。它是不可移植的,依赖于(a)特定的供应商。您会注意到四个
hello
输出中的一个在时间=0时显示。这是由于初始化(IEEE Std 1076-2008 14.7.5.2)导致的,其中每个进程执行直到挂起,这里是从进程敏感度列表导出的最后一个隐式等待语句。进程在wait语句(10.2 wait语句)中暂停和恢复。使用模拟时间限定流程中顺序语句的执行,或者在这些顺序语句之前使用显式等待语句代替流程敏感度列表,以防止在时间0执行。
event\u a您是对的。学童错误。
实际上只会触发一个事件-一个在90纳秒
不,您将得到三个事件。在投影输出波形中,任何模拟时间只有一个条目。在不同的时间有不同的顺序和顺序。在引用部分之前的物理文本中,抽象文本和时间单位之间缺少空格。见IEEE标准1