在数字电路仿真中, 仿真竞争条件(Simulation Race Condition) 是指多个并行的信号或事件在同一仿真时间步(time step)内因实行序次不确定,导致仿真效果不可预测或与真实硬件举动不同等的征象。这种问题在 Verilog 中较为常见,而 System Verilog 通过引入新的机制来规避它。
<hr> 为什么会出现仿真竞争条件?
仿真器是序次实行的(非并行),但电路举动本质是并行的。当多个操作(如信号赋值、时钟边沿触发等)在同一仿真时间步内发生,仿真器须要决定它们的实行序次。若序次差异导致效果差异,就产生了竞争条件。
典范场景举例
假设在 always @(posedge clk) 触发时,测试平台(Testbench)同时修改输入信号:
- // Verilog 示例:潜在的竞争条件
- module design (input clk, input a, output reg b);
- always @(posedge clk) begin
- b <= a; // 在时钟上升沿将 a 的值赋给 b(非阻塞赋值)
- end
- endmodule
- module testbench;
- reg clk = 0;
- reg a = 0;
- design dut (clk, a, b);
- initial begin
- #10;
- clk = 1; // 时钟上升沿
- a = 1; // 同时修改输入信号 a
- #10;
- $display("b = %d", b); // 输出可能不确定!
- end
- endmodule
复制代码
- 问题:在 clk 上升沿(posedge clk)触发的同一时刻,测试平台修改了输入 a。
- 仿真器的实行序次可能有两种:
- 先实行 clk=1 触发 always 块,此时 a 仍为旧值 0 → b 被赋值为 0。
- 先实行 a=1,然后 clk=1 触发 always 块 → b 被赋值为 1。
- 效果取决于仿真器的实行序次,导致不可预测的输出。
<hr> System Verilog 怎样办理竞争条件?
1. 使用 program 块隔离测试平台
System Verilog 引入了 program 块,将测试代码与设计代码的实行阶段分离:
- 设计代码(module):在仿真器的 Active 地区 实行。
- 测试代码(program):在 Reactive 地区 实行(在 Active 地区之后)。
[code][/code]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |