我对语句always_ff
和always_latch
的用法感到困惑。前者将被用作:
always_ff @ (posedge clk)
begin
a <= b;
end
而后者:
always_latch
begin
a <= b;
end
第一个被时钟的正边缘激活,再加上非阻塞分配,产生一个FF。
显然,always_latch
被认为是一个锁存器,但是为什么要使用非阻塞分配呢?
使用带有阻塞分配的always_comb
不是更好吗?
发布于 2015-07-01 16:14:18
通过使用always_latch或always_ff,设计人员将分别推断锁存逻辑或顺序逻辑,但如果逻辑不正确,软件工具可以警告设计人员,无法正确推断预期的硬件逻辑。
例:
always_ff @ (posedge clk or negedge rst)
begin
if (!rst)
a <= '0;
end
对于上面的代码,设计人员只打算获得一个顺序逻辑,而不是一个锁存器,但是实际中会生成一个锁存器(任何静态工具都会生成一条警告消息,因为"Latch将被推断为逻辑“)
类似地,对于下面的代码,设计人员的目的是推断硬件锁存,这样工具就会(更好地理解您的逻辑)而不会报告它。
always_latch
begin
if (rst)
a <= b;
end
锁存器是一种顺序逻辑,它工作在时钟的水平上,而不是时钟的边缘。
通常,最佳实践是对顺序逻辑使用非阻塞分配,对组合逻辑使用阻塞分配,这将在非阻塞分配在Verilog合成,编码样式,杀死! 5.0Verilog编码指南中详细解释。
准则2:在建模锁存时,使用非阻塞分配。
发布于 2015-07-01 15:58:21
源自IEEEST1800-2012,"9.2.2.3锁存逻辑always_latch过程“一节:
always_latch构造与always_comb构造相同,只是如果always_latch构造中的行为不表示锁存逻辑,则软件工具应该执行额外的检查和警告,而在always_comb构造中,如果行为不表示组合逻辑,则工具应该进行检查和警告。
Std中的代码示例显示了使用非阻塞分配的always_latch。
https://stackoverflow.com/questions/31165545
复制相似问题