在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?
仿真算法由初始化阶段和随后的重复仿真周期组成。初始化期间,
cnt
由0驱动,所有进程将运行直到挂起。
那么,这实际上意味着什么呢?首先,您的
test
程序对 cnt
敏感,因此会醒来,并在时间 0 报告“零”。
其次,您的进程将运行直到出现
wait
语句,然后挂起。它计划在 10ns 唤醒。初始化现已完成,模拟周期开始。在 10ns 时,进程恢复,并将 0 分配给 cnt
;然而,cnt
已经是0,所以什么也没有发生。循环重复,并在 wait
处暂停,并计划在 20ns 处恢复。在 20ns 时它恢复,并用 1 驱动 cnt
。该过程对此变化敏感,执行并在时间 20 报告“One”。