行为级、RTL 级和门级之间的区别
Difference between Behavioral, RTL and gate Level
我试图完全理解 Verilog 抽象级别之间的差异,我明白了每个级别的描述,但我仍然无法在游戏中理解它。
对于这种情况,我将粘贴一些 Verilog 代码以及我对它们的看法:
以下代码在行为级别。
always @ (a or b or sel)
begin
y = 0;
if (sel == 0) begin
y = a;
end else begin
y = b;
end
end
这(只是一个例子)在门级
module test(clk, ready, next, Q);
input clk, enable, next;
output Q;
\**SEQGEN** reg_1 (.clear(1'b0), .next_state(next), .clocked_on(clk), .Q(Q), .synch_enable(enable) );
endmodule
我不知道这段代码是在 RTL 还是门级(我希望 always 关键字使这个 RTL 而不是门级)
module dff_from_nand();
wire Q,Q_BAR;
reg D,CLK;
nand U1 (X,D,CLK) ;
nand U2 (Y,X,CLK) ;
nand U3 (Q,Q_BAR,X);
nand U4 (Q_BAR,Q,Y);
// Testbench of above code
initial begin
$monitor("CLK = %b D = %b Q = %b Q_BAR = %b",CLK, D, Q, Q_BAR);
CLK = 0;
D = 0;
#3 D = 1;
#3 D = 0;
#3 $finish;
end
always #2 CLK = ~CLK;
endmodule
我已经知道 initial begin
和 end
不可合成,仅用于测试。现在我有2个问题
第三个(也是第二个)代码是 RTL 还是 Gate-Level?什么是好的 RTL 代码示例?我找到了这个 RTL Code Example 但这真的是 RTL 吗?对我来说,它看起来像行为水平。
Verilog网表是什么意思?它与门级相同还是具有上下文基础定义?
我很困惑,因为在某些网站上我不知道他们说的是 'this is a Verilog code that is using logic gates' 还是 'this is a Verilog code in gate-level'
如果有人想解释有关此主题的更多详细信息,我将非常高兴:)
- 行为水平。
- RTL 级别(不必是门级别,而是原始级别。
- 混合工作module/testbench,全部包含在一个模块中。这不是使用 Verilog 进行设计的最佳方法,但可以作为教学示例。其实这个例子其实就是两个模块:
测试台,可以被认为是行为的,即使它使用 RTL 编码来实例化将要测试的模块到测试台驱动的 regs 和电线:
module testbench_dff;
wire Q,Q_BAR;
reg D,CLK;
// Instantiate the unit under test
dff_from_nand uut (.CLK(CLK), .D(D), .Q(Q), .Q_BAR(Q_BAR) );
// Testbench
initial begin
$monitor("CLK = %b D = %b Q = %b Q_BAR = %b",CLK, D, Q, Q_BAR);
CLK = 0;
D = 0;
#3 D = 1;
#3 D = 0;
#3 $finish;
end
always #2 CLK = ~CLK;
endmodule
正在测试的被测单元(UUT),它是一个像这样的模块(这显然是一个 RTL 级 - 实际上是门级 - 模块):
module dff_from_nand (
input wire CLK,
input wire D,
output wire Q,
output wire Q_BAR
);
wire X,Y;
nand U1 (X,D,CLK) ;
nand U2 (Y,X,CLK) ;
nand U3 (Q,Q_BAR,X);
nand U4 (Q_BAR,Q,Y);
endmodule
据我了解,RTL 级模块是显式给出逻辑方程的模块。行为模块具有进程(在 Verilog 中使用 always
块,尽管可以在这些块内使用逻辑方程)。任何重要的 Verilog 设计都将同时具备。
RTL : Register-Transfer-Level, 一种抽象的硬件功能,用 always
块和 assign
可综合的语句编写(可以翻译成门级)。纯 RTL 不实例化子模块。 RTL 可以包含子模块来指导合成器。结构 RTL(通常仍称为 RTL)是一个包含其他 RTL 模块的模块。示例:FSM(有限状态机)
always @* begin
next_state = state;
if (count>0) next_count = count - 1;
case (state)
IDLE :
if(do_start) begin
next_state = START;
next_count = 2;
end
START :
if (do_wait) begin
next_count = count;
end
else if (count==0) begin
next_state = RUN;
next_count = count_from_input;
end
RUN :
if (do_stop) begin
next_state = IDLE;
end
if (do_wait) begin
next_count = count;
end
else if (count==0) begin
next_state = IDLE;
end
endcase
end
always @(posedge clk, negedge rst_n) begin
if (!rst_n) begin
count <= 0;
state <= IDLE;
end
else begin
count <= next_count;
state <= next_state;
end
end
Behavioral :模拟硬件的所需功能,但不一定是可综合的。没有严格的规则,只要代码生成所需的行为即可。准则是保持简单和可读。行为通常用于表示模拟块、占位符代码(RTL/gates 未准备好)和测试台代码。示例:时钟发生器、延迟单元。
always begin
if (!clk_en && clk==1'b1) begin
wait (clk_en);
end
#5 clk = ~clk;
end
RTL 和 Behavioral 之间的主要区别在于综合能力。如果您看到 #
延迟、wait
语句、while
循环、force
/release
语句或分层引用,则它是行为性的。从技术上讲,有一些罕见的可原谅的例外,但如果这个问题超出了范围。
门级(又名结构):仅由门和模块描述的逻辑。没有 always
块或 assign
语句。这是硬件中真实门的代表。
Verilog Netlist 是设计中使用的 Verilog 模块的集合。它可以是一个或多个文件。它可以是 RTL、行为和结构的混合。通常它主要是结构性的,特别是对于大型设计。
我试图完全理解 Verilog 抽象级别之间的差异,我明白了每个级别的描述,但我仍然无法在游戏中理解它。
对于这种情况,我将粘贴一些 Verilog 代码以及我对它们的看法:
以下代码在行为级别。
always @ (a or b or sel) begin y = 0; if (sel == 0) begin y = a; end else begin y = b; end end
这(只是一个例子)在门级
module test(clk, ready, next, Q); input clk, enable, next; output Q; \**SEQGEN** reg_1 (.clear(1'b0), .next_state(next), .clocked_on(clk), .Q(Q), .synch_enable(enable) ); endmodule
我不知道这段代码是在 RTL 还是门级(我希望 always 关键字使这个 RTL 而不是门级)
module dff_from_nand(); wire Q,Q_BAR; reg D,CLK; nand U1 (X,D,CLK) ; nand U2 (Y,X,CLK) ; nand U3 (Q,Q_BAR,X); nand U4 (Q_BAR,Q,Y); // Testbench of above code initial begin $monitor("CLK = %b D = %b Q = %b Q_BAR = %b",CLK, D, Q, Q_BAR); CLK = 0; D = 0; #3 D = 1; #3 D = 0; #3 $finish; end always #2 CLK = ~CLK; endmodule
我已经知道 initial begin
和 end
不可合成,仅用于测试。现在我有2个问题
第三个(也是第二个)代码是 RTL 还是 Gate-Level?什么是好的 RTL 代码示例?我找到了这个 RTL Code Example 但这真的是 RTL 吗?对我来说,它看起来像行为水平。
Verilog网表是什么意思?它与门级相同还是具有上下文基础定义?
我很困惑,因为在某些网站上我不知道他们说的是 'this is a Verilog code that is using logic gates' 还是 'this is a Verilog code in gate-level'
如果有人想解释有关此主题的更多详细信息,我将非常高兴:)
- 行为水平。
- RTL 级别(不必是门级别,而是原始级别。
- 混合工作module/testbench,全部包含在一个模块中。这不是使用 Verilog 进行设计的最佳方法,但可以作为教学示例。其实这个例子其实就是两个模块:
测试台,可以被认为是行为的,即使它使用 RTL 编码来实例化将要测试的模块到测试台驱动的 regs 和电线:
module testbench_dff;
wire Q,Q_BAR;
reg D,CLK;
// Instantiate the unit under test
dff_from_nand uut (.CLK(CLK), .D(D), .Q(Q), .Q_BAR(Q_BAR) );
// Testbench
initial begin
$monitor("CLK = %b D = %b Q = %b Q_BAR = %b",CLK, D, Q, Q_BAR);
CLK = 0;
D = 0;
#3 D = 1;
#3 D = 0;
#3 $finish;
end
always #2 CLK = ~CLK;
endmodule
正在测试的被测单元(UUT),它是一个像这样的模块(这显然是一个 RTL 级 - 实际上是门级 - 模块):
module dff_from_nand (
input wire CLK,
input wire D,
output wire Q,
output wire Q_BAR
);
wire X,Y;
nand U1 (X,D,CLK) ;
nand U2 (Y,X,CLK) ;
nand U3 (Q,Q_BAR,X);
nand U4 (Q_BAR,Q,Y);
endmodule
据我了解,RTL 级模块是显式给出逻辑方程的模块。行为模块具有进程(在 Verilog 中使用 always
块,尽管可以在这些块内使用逻辑方程)。任何重要的 Verilog 设计都将同时具备。
RTL : Register-Transfer-Level, 一种抽象的硬件功能,用 always
块和 assign
可综合的语句编写(可以翻译成门级)。纯 RTL 不实例化子模块。 RTL 可以包含子模块来指导合成器。结构 RTL(通常仍称为 RTL)是一个包含其他 RTL 模块的模块。示例:FSM(有限状态机)
always @* begin
next_state = state;
if (count>0) next_count = count - 1;
case (state)
IDLE :
if(do_start) begin
next_state = START;
next_count = 2;
end
START :
if (do_wait) begin
next_count = count;
end
else if (count==0) begin
next_state = RUN;
next_count = count_from_input;
end
RUN :
if (do_stop) begin
next_state = IDLE;
end
if (do_wait) begin
next_count = count;
end
else if (count==0) begin
next_state = IDLE;
end
endcase
end
always @(posedge clk, negedge rst_n) begin
if (!rst_n) begin
count <= 0;
state <= IDLE;
end
else begin
count <= next_count;
state <= next_state;
end
end
Behavioral :模拟硬件的所需功能,但不一定是可综合的。没有严格的规则,只要代码生成所需的行为即可。准则是保持简单和可读。行为通常用于表示模拟块、占位符代码(RTL/gates 未准备好)和测试台代码。示例:时钟发生器、延迟单元。
always begin
if (!clk_en && clk==1'b1) begin
wait (clk_en);
end
#5 clk = ~clk;
end
RTL 和 Behavioral 之间的主要区别在于综合能力。如果您看到 #
延迟、wait
语句、while
循环、force
/release
语句或分层引用,则它是行为性的。从技术上讲,有一些罕见的可原谅的例外,但如果这个问题超出了范围。
门级(又名结构):仅由门和模块描述的逻辑。没有 always
块或 assign
语句。这是硬件中真实门的代表。
Verilog Netlist 是设计中使用的 Verilog 模块的集合。它可以是一个或多个文件。它可以是 RTL、行为和结构的混合。通常它主要是结构性的,特别是对于大型设计。