我试图完全理解Verilog的抽象级别之间的差异,我得到了每个级别的描述,但我仍然无法在游戏中得到它.
对于这种情况,我将粘贴一些Verilog代码以及我对它们的看法:
以下代码位于行为级别.
always @ (a or b or sel)
begin
y = 0;
if (sel == 0) begin
y = a;
end else begin
y = b;
end
end
Run Code Online (Sandbox Code Playgroud)这(仅举例)是门级
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
Run Code Online (Sandbox Code Playgroud)我不知道这段代码是在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
Run Code Online (Sandbox Code Playgroud)我已经知道initial begin并且end不可合成,只是用于测试.现在我有2个问题
第三(和第二)代码是RTL还是Gate-Leve?什么是一个很好的RTL代码示例?我发现这个RTL代码示例但是真的是RTL吗?对我来说,它看起来像行为水平.
什么意味着Verilog网表?它与门级相同还是具有上下文基本定义?
我很困惑,因为在某些网站上我不知道他们是否说'这是一个使用逻辑门的Verilog代码'或'这是门级的Verilog代码'
如果有人想解释有关这个主题的更多细节,我将非常高兴:)
Gre*_*reg 12
RTL:寄存器传输级,一种用可合成的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
Run Code Online (Sandbox Code Playgroud)
行为:模仿硬件的所需功能,但不一定是可综合的.只要代码生成所需的行为,就没有严格的规则.准则是保持简单和可读.行为通常用于表示模拟块,占位符代码(RTL /门未准备好)和测试平台代码.示例:时钟发生器,延迟单元.
always begin
if (!clk_en && clk==1'b1) begin
wait (clk_en);
end
#5 clk = ~clk;
end
Run Code Online (Sandbox Code Playgroud)
RTL和Behavioral之间的关键区别在于合成的能力.如果您看到#延迟,wait语句,while循环,force/ release语句或分层引用,则是行为.从技术上讲,有一些罕见的可原因例外,但如果这个问题,那就超出了范围.
门级(又称结构):仅由门和模块描述的逻辑.没有always块或assign声明.这是硬件中真实门的代表.
Verilog Netlist 是设计中使用的Verilog模块的集合.它可以是一个或多个文件.它可以是RTL,Behavioral和Structural的混合体.通常它主要是结构,特别是对于大型设计.
| 归档时间: |
|
| 查看次数: |
16002 次 |
| 最近记录: |