Verilog 始终块属性 - 顺序与组合
Verilog always block properties - sequential vs. combinatorial
我明白 always
块可以用来实现过程逻辑和顺序逻辑。
- 下面两段代码的gate-level实现是一样的吗?如果是,描述这种连续时间逻辑的正确方法是什么?
一个.
module func(input a, input b , output reg o);
always @(a,b)
o=a&b;
endmodule
b.
module func(input, a, input b, output o);
assign o = a & b;
endmodule
在 (a) 中,'o' 是 reg 类型,在 (b) 中是电线。这种差异意味着什么?
- 合成工具实现 FF 所需的 'always' 块属性是什么?我知道以下将导致 FF:
always @(posedge clk or negedge rst)
[...]
但是,我正在寻找更深入的了解。
您的 (a) 和 (b) 代码在功能上是等效的。这意味着它们将以相同的方式进行模拟,并且在合成时将推断出相同的逻辑。
他们使用 2 种不同的建模风格:(a) 使用 程序 赋值,因为它使用 always
块,而 (b) 使用 continuous赋值,因为没有always
块,它使用了assign
关键字。
在这种简单的情况下,没有“正确”的方法;它们是实现相同功能的两种不同样式。对于这种简单的逻辑,最好使用(b),因为它使用的代码更少,也更容易理解。但是,如果您的组合逻辑更复杂,过程方法可能更容易理解。
在 (a) 中,o
信号必须是 reg
类型,因为它是在过程逻辑块内分配的。连续分配没有这样的要求。在这种情况下,定义 reg
类型不会产生触发器。当 always
块描述时序逻辑
时,reg
仅推断出触发器
综合工具在 Verilog 代码中寻找特定类型的模式来推断时序逻辑。以下将推断具有 异步 重置的触发器:
always @(posedge clk or negedge rst)
if (!rst) ...
else ...
以下将推断具有同步复位的触发器:
always @(posedge clk)
if (!rst) ...
else ...
这些只是几个例子。
我明白 always
块可以用来实现过程逻辑和顺序逻辑。
- 下面两段代码的gate-level实现是一样的吗?如果是,描述这种连续时间逻辑的正确方法是什么?
一个.
module func(input a, input b , output reg o);
always @(a,b)
o=a&b;
endmodule
b.
module func(input, a, input b, output o);
assign o = a & b;
endmodule
在 (a) 中,'o' 是 reg 类型,在 (b) 中是电线。这种差异意味着什么?
- 合成工具实现 FF 所需的 'always' 块属性是什么?我知道以下将导致 FF:
always @(posedge clk or negedge rst)
[...]
但是,我正在寻找更深入的了解。
您的 (a) 和 (b) 代码在功能上是等效的。这意味着它们将以相同的方式进行模拟,并且在合成时将推断出相同的逻辑。
他们使用 2 种不同的建模风格:(a) 使用 程序 赋值,因为它使用 always
块,而 (b) 使用 continuous赋值,因为没有always
块,它使用了assign
关键字。
在这种简单的情况下,没有“正确”的方法;它们是实现相同功能的两种不同样式。对于这种简单的逻辑,最好使用(b),因为它使用的代码更少,也更容易理解。但是,如果您的组合逻辑更复杂,过程方法可能更容易理解。
在 (a) 中,o
信号必须是 reg
类型,因为它是在过程逻辑块内分配的。连续分配没有这样的要求。在这种情况下,定义 reg
类型不会产生触发器。当 always
块描述时序逻辑
reg
仅推断出触发器
综合工具在 Verilog 代码中寻找特定类型的模式来推断时序逻辑。以下将推断具有 异步 重置的触发器:
always @(posedge clk or negedge rst)
if (!rst) ...
else ...
以下将推断具有同步复位的触发器:
always @(posedge clk)
if (!rst) ...
else ...
这些只是几个例子。