问题描述
我试图理解具有不同参数类的并发过程调用。假设我已经进行了过程测试,并且它被并发调用,如下所示:
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设计师指南
中关于并发过程调用的另一点要注意的是,如果没有信号 与in-mode或inout-mode参数相关联,等效的wait语句 进程没有敏感度子句。如果该过程返回,则该过程将无限期暂停。如果我们希望只在过程中调用一次,这可能会很有用。 启动时间。
由于过程测试没有与in-mode或inout-mode相关的信号,因此它假定执行一次,然后无限期挂起。但是在此示例中,该过程执行了4次。
有人可以向我解释发生了什么或我错过了什么?
解决方法
2008 LRM(IEEE标准1076-2008)的11.4节:
对于任何并发过程调用语句,有一个等效项 流程声明[...]等效流程声明也没有 敏感度列表,一个空的声明部分和一个声明部分, 由一个过程调用语句和一个等待语句组成。 过程调用语句由相同的过程名称和 并发过程调用中出现的实际参数部分 声明。
如果在任何实际部分中存在表示信号的名称 并发过程调用语句中的关联元素,以及 实际值与in或inout模式的形式参数有关, 然后等效的流程语句包括最终的等待语句 带有一个敏感性子句,该子句通过将 通过对每个实际零件应用10.2规则构建的集合 与形式参数关联。
忘记最后一部分,就您而言,事情非常简单,等效的过程是:
process
begin
test(cnt,str);
wait on cnt;
end process;
过程声明的CONSTANT
类声明仅表明(第4.2.2.2节):
对于常量或变量类的参数,仅 实际的或正式的都将传入或传出子程序调用。
它以某种方式迫使您操纵此值,就好像它是一个常量,而在过程的主体内没有别的一样。例如,它禁止您使用信号属性(例如number'EVENT
)。但这并没有说明在实例化过程时要与该形式参数关联的实际参数。
从逻辑上讲,结果是您观察到的结果:您的过程在等效过程中被调用4次。每次实际参数的值,即信号cnt
都通过形式参数number
传递。
您的书是对的:
[...]如果没有与in-mode或inout-mode相关的信号 参数,等效过程中的wait语句没有 敏感性条款。
实际上,您有一个与模式参数(cnt
)相关的信号(number
)。