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指出检查条件的错误。