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设计师指南

关于并发过程调用的另一点要注意的是,如果没有信号 与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)。