vhdl中的并发过程调用



我正在尝试理解具有不同参数类的并发过程调用。假设我有程序测试,它被同时调用,如下所示:

ENTITY tb IS
END ENTITY tb;
ARCHITECTURE sim OF tb IS
SIGNAL cnt  : integer RANGE 0 TO 3 := 0;
SIGNAL str  : string(1 TO 5) := (OTHERS => ' ');

PROCEDURE test (CONSTANT number  : IN integer RANGE 0 TO 3 := 0;
SIGNAL   num_str : OUT string(1 TO 5)) IS
BEGIN
REPORT "here";
CASE number IS
WHEN 0      => num_str <= "zero ";
WHEN OTHERS => num_str <= "one  ";
END CASE;
END PROCEDURE;

BEGIN
test(cnt, str);  -- CONCURRENT CALL TO PROCEDURE TEST
PROCESS 
BEGIN
FOR i IN 0 TO 3 LOOP
WAIT FOR 10 ns;
cnt <= i;
END LOOP;
WAIT;
END PROCESS;
END ARCHITECTURE sim;

VHDL设计器GUI中

关于并发过程调用的另一点需要注意的是,如果没有信号与in模式或inout模式参数相关,等效的中的wait语句流程并没有敏感度条款。如果该过程返回,则该过程将无限期挂起。如果我们希望过程在启动时间。

由于过程测试没有与in模式或inout模式相关的信号,因此它假定执行一次,然后无限期挂起。但是在这个例子中,该过程被执行了4次。

有人能向我解释发生了什么或我错过了什么吗

2008 LRM(IEEE Std 1076-2008(第11.4节:

对于任何并发过程调用语句,都有一个等价的流程语句[…]等效的流程语句也没有敏感度列表、一个空的声明性部分和一个由过程调用语句和等待语句组成。过程调用语句由相同的过程名称和出现在并发过程调用中的实际参数部分陈述

如果在任何并发过程调用语句中的关联元素,以及该实际值与mode in或inout的形式参数相关联,那么等效的process语句包括一个最终的wait语句带有一个敏感度子句,该子句由通过将10.2规则应用于每个实际部分而构建的集合与形式参数相关联。

忘记最后一部分,在您的情况下,事情非常简单,您的等效过程是:

process
begin
test(cnt, str);
wait on cnt;
end process;

程序声明的CONSTANT类声明仅表明(第4.2.2.2节(:

对于类常量或变量的参数,只有实际的或形式的被转移到子程序调用中或从子程序调用中转移出来。

它以某种方式迫使你操纵这个值,就好像它是一个常量而不是其他。。。在手术体内。例如,它禁止您使用信号属性(例如number'EVENT(。但它没有说明在实例化过程时将与此形式参数关联的实际参数。

从逻辑上讲,结果就是你所观察到的:你的过程在等效过程中被调用了4次。每次实际参数的值,即信号cnt通过形式参数number

你的书是对的:

[…]如果没有与in模式或inout模式相关的信号参数,等效进程中的wait语句没有敏感性条款。

实际上,您有一个与模式参数(number(相关联的信号(cnt(。

最新更新