使用触发器的带时钟分频器的Verilog竞赛

使用触发器的带时钟分频器的Verilog竞赛,verilog,system-verilog,clock,race-condition,edaplayground,Verilog,System Verilog,Clock,Race Condition,Edaplayground,我就我遇到的问题举了一个基本的例子。 假设我有两个时钟1x和2x。使用触发器除法器将2x与1x分开 我有两个寄存器a和b。a按1x计时,b按2x计时 b是a的采样值 当我们有1x和2x时钟的上升沿时,b不是取a的预期值,而是取下一个周期值 这是因为这种时钟分频器方案,如果我们使用ICG和en进行分频,它工作得很好。 但是,有没有一种方法可以使它工作使用这种时钟分频器方案与触发器 EDA游乐场链接: modulerace\u测试; 逻辑clk1x=0; 逻辑clk2x=0; 总是 #5ns clk

我就我遇到的问题举了一个基本的例子。 假设我有两个时钟1x和2x。使用触发器除法器将2x与1x分开

我有两个寄存器a和b。a按1x计时,b按2x计时

b是a的采样值

当我们有1x和2x时钟的上升沿时,b不是取a的预期值,而是取下一个周期值

这是因为这种时钟分频器方案,如果我们使用ICG和en进行分频,它工作得很好。 但是,有没有一种方法可以使它工作使用这种时钟分频器方案与触发器

EDA游乐场链接:

modulerace\u测试;
逻辑clk1x=0;
逻辑clk2x=0;
总是
#5ns clk1x=!clk1x;
INTA,b;
始终@(posedge clk1x)开始

数字时钟分频器在模拟和物理定时方面都存在问题

Verilog的非阻塞赋值运算符假定读写相同变量的每个人都同步到相同的时钟事件。通过使用NBA写入
clk2x
,您已经将
a
的读取转移到另一个增量时间*,并且您发现,
a
已经更新

在实际硬件中,存在相当大的传播延迟,通常可以避免这种情况。但是,您使用相同的D-flop分配给
clk2x
,因此那里也会有传播延迟。最后一个
始终
块现在表示一个时钟域交叉问题。因此,根据两个时钟之间的偏差,仍然可能存在竞争条件

纠正这种情况的一种方法是使用具有更高频率时钟的时钟发生器模块

always #2.5ns clk = !clk;

always @(posedge clk) begin
       clk1x <= !clk1x;
       if (clk1x == 1)
         clk2x = !clk2x;
始终#2.5ns时钟=!时钟;
始终@(posedge clk)开始

clk1x请看链接,这正是我所期待的。使用时钟分频器的阻塞分配,它可以正常工作。但是,如果我的时钟分频器不是一个模型,而是一个真正的触发器,将在我的芯片上,这是正确的吗?在书中,他们说合成器会很好(希望如此),一般来说,经验法则是,你永远不会使用NBAs作为时钟来避免竞争。嗨,Dave,如果代码用于建模或验证,你提供的解决方案很好。在我的例子中,用于时钟划分的触发器用于RTL,我想确保合成器正确地实现它。我找到的最干净的修复方法是,在可能的情况下,用ICG替换分隔器方案。但唯一不可能的情况是,我生成的时钟必须是50/50占空比。有没有办法用ICG产生50/50时钟?我认为答案取决于你使用的技术,以及clk1x的来源。也许对我来说是个更好的问题
always #2.5ns clk = !clk;

always @(posedge clk) begin
       clk1x <= !clk1x;
       if (clk1x == 1)
         clk2x = !clk2x;