Verilog 不可复位触发器代码

Verilog 不可复位触发器代码,verilog,system-verilog,Verilog,System Verilog,这是一种可接受的编码不可重置触发器的方法吗 input clk; input b; output a; reg a= 1'b0; always_ff @ (posedge clk) if(b>a) a<=b; 输入时钟; 输入b; 输出a; reg a=1'b0; 始终_ff@(posedge clk) 如果(b>a) a不可复位触发器在任何地方都使用 可复位触发器的技术优势在于,您可以在有限的机器中使用复位引脚上的单个转换达到“已知”状态,否则您可能需要在时钟上经

这是一种可接受的编码不可重置触发器的方法吗

input clk;
input b; 
output a;
reg a= 1'b0;

always_ff @ (posedge clk)
  if(b>a)
    a<=b;
输入时钟;
输入b;
输出a;
reg a=1'b0;
始终_ff@(posedge clk)
如果(b>a)

a不可复位触发器在任何地方都使用

可复位触发器的技术优势在于,您可以在有限的机器中使用复位引脚上的单个转换达到“已知”状态,否则您可能需要在时钟上经历多个周期才能达到已知状态

这主要是在芯片上通电时需要的。在“不需要周期数”和为可重置触发器支付的额外区域之间存在权衡

此外,如前所述

在没有设置/复位引脚的触发器的情况下,只有当输入D在时钟到达时处于已知的稳定状态并且满足设置和保持要求时,输出才是确定的。在初始通电期间,此类触发器的输出将不会初始化,而是处于未知状态,在数字模拟中被视为X。它一直保持X,直到第一个时钟边缘出现,并随之出现输入端的功能稳定值

以下在verilog中的实现和您在SV中的实现是可以接受的

  always @ (posedge sclk) 
    din_o <= din_i;
始终@(posedge sclk)

这段代码描述了一个具有初始值的触发器。如何使用初始值取决于目标。FPGA将在复位时将初始值加载到寄存器中。ASIC忽略初始值。模拟器在时间0加载初始值,但不在重置时加载

因此,该代码生成一个寄存器
a
,它是:

  • 由语句
    reg a=1'b0
    初始化为零,但将忽略重置。这是模拟中的行为
  • 通过语句
    reg a=1'b0
    将值重置为零。这是FPGA上的行为(如果在开始时只有重置,那么在模拟中就足够接近了)
  • 复位时包含一个随机未知值,因此比较结果
    a>b
    未知,电路行为未知。这是ASIC上的行为
  • 我怀疑你所追求的行为是第二种,因为其他两种都不是很有用。请注意,为了获得可预测的电路行为,您需要在重置时加载初始值,因此这是一个重置触发器,只是您没有明确编写代码来观察重置

    非复位触发器是指我们不关心初始状态的触发器。例如,FIFO具有存储通过它的数据的寄存器,以及存储FIFO的空/满状态的寄存器。通电或复位时,我们关心FIFO的状态被复位为空,因此状态寄存器必须复位。我们不关心数据寄存器包含什么,因为FIFO是空的,所以数据寄存器可以不重置


    顺便说一句,您编写的代码在
    a
    中始终为零,因为
    a
    从零开始,并且永远不会大于
    b
    。因此,
    a
    将永远不会分配给。我想你的意思是,条件是
    a
    ,电路捕捉
    b

    的最大值不复位触发器肯定很常见,我不确定我会说不复位的触发器在任何设计中都有最高的使用率。我取决于申请。这也取决于设计规则。在我的上一家公司,所有触发器都是异步复位的。这是规则。这样做可以使制造测试更容易。还有一件事。。。硅可以有
    X
    :你如何描述触发器的亚稳态,或者由两个驱动器朝相反方向拉动的网络的状态?@MatthewTaylor:是的!你是对的,但我担心的是,合成和模拟结果不匹配。@MatthewTaylor我不确定我将如何描述这些电效应。但在向人们介绍Verilog和硬件设计时,我经常指出x是未知的。重置时为0或1,但对于模拟,我们不知道。然后他们就明白了为什么不能在(a==1'bx)
    的情况下进行合成表示通电复位条件。对于ASIC合成,它将被忽略,可能导致RTL与门模拟不匹配。感谢@Paul指出检查条件的错误。