并发 VHDL 程序中的仿真时间

问题描述 投票:0回答:1

在EdaPlayground中模拟以下代码, 给我代码下面的模拟结果


--CONCURRENT PROCEDURE CALL TIMING PROBLEM
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
 
  
    CASE number IS
      WHEN 0      => num_str <= "zero "; REPORT "Zero";
      WHEN OTHERS => num_str <= "one  "; REPORT "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;   --this timing is not OK. Second transaction is @20ns WHY not @10ns
     cnt <= i;
     --WAIT FOR 10 ns;  --this timing is OK
  END LOOP;
 WAIT;
 END PROCESS;
 
 ----Process
-- begin
 --wait until cnt'transaction;
 --report "*******************Transaction happen at report current time = " & time'image(now);
 --end process;
 
END ARCHITECTURE sim;

我的问题是,为什么模拟时间前进0ns、20ns、30ns、40ns而不是 0纳秒、10纳秒、20纳秒、30纳秒? 如果我移动“等待 10 ns;”在cnt之后<=i; simulation timing looks correct. Is it some sort of race condition?

vhdl simulation timing
1个回答
0
投票

仿真算法由初始化阶段和随后的重复仿真周期组成。初始化期间,

cnt
由0驱动,所有进程将运行直到挂起。

那么,这实际上意味着什么呢?首先,您的

test
程序对
cnt
敏感,因此会醒来,并在时间 0 报告“零”。

其次,您的进程将运行直到出现

wait
语句,然后挂起。它计划在 10ns 唤醒。初始化现已完成,模拟周期开始。在 10ns 时,进程恢复,并将 0 分配给
cnt
;然而,
cnt
已经是0,所以什么也没有发生。循环重复,并在
wait
处暂停,并计划在 20ns 处恢复。在 20ns 时它恢复,并用 1 驱动
cnt
。该过程对此变化敏感,执行并在时间 20 报告“One”。

© www.soinside.com 2019 - 2024. All rights reserved.