使用门级建模与行为建模在 Verilog 中对 D 型触发器进行建模似乎会导致在时钟信号的不同边沿发生状态转换。我确信我错过了一些东西,所以寻求一些指导。对于门级模型,有两个内部 D 锁存器(至少是我这样做的方式),第二个(输出)锁存器具有反相时钟信号。在上升沿,第一个锁存器拾取输入,在下降沿,第二个锁存器将输入传播到输出。通过行为模型(在 posege 上触发),锁存器的输出似乎会在正边沿立即转换。这似乎是两种截然不同的结果。这是通过 iverilog 或 Vivado 进行仿真时的情况。
CPU 在行为或门级建模方面都能正常工作,但转换发生在时钟信号的不同阶段。
reg [15:0] R;
assign OUT = R;
initial R = 0;
always@(posedge CLK) begin
if(ST) begin
R <= X;
end
end
如果我更新行为 Verilog 以在下降沿触发,我的应用程序(CPU)会失败。
问题是:这重要吗?是否有更好的方法来建立与门级实现更匹配的 D 型触发器的行为模型?或者,如果您在综合后进行模拟,这种差异会消失吗?预先感谢!
我认为你的基本问题在这里:
在上升沿,第一个锁存器拾取输入,在 下降沿第二个锁存器将输入传播到输出。
如果您希望主从锁存器组合看起来像正边沿触发的 D 型 F/F,那么主器件应在时钟低电平时透明,而从器件在时钟上升时捕获主器件的状态。在原理图上,当 CLK(和 STO)为高时,N2 和 N3 反转。 IOW,当 CLK 为高而不是低时,您的主锁存器是透明的。您可能可以通过将 AND_0 更改为 NAND 来修复它。
但是...别打扰。对于任何类型的建模来说,这都是错误的方法。过去,F/F 被构建为适当的门级异步电路,其中反馈确保一个输入上的[上升]沿提供稳定的采样输出。如今,它可能是某种交叉耦合逆变器。我不知道有任何真正的商业电路曾经将 F/F 作为一对锁存器来实现。关键是你实际上对真正的实现是什么知之甚少;这是(本质上是模拟的)硅人的工作。对于行为建模,只需使用正常的
always@(posedge CLK)
代码即可。对于时序仿真,请查看供应商的“门级”模型的来源,您几乎肯定会看到它是作为真值表以行为方式实现的,并带有反向注释的实际延迟。