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

我已经知道初始开始和结束不可合成,只是用于测试.现在我有2个问题

>第三(和第二)代码是RTL还是Gate-Leve?什么是一个很好的RTL代码示例?我发现这个RTL Code Example但是真的是RTL吗?对我来说,它看起来像行为水平.
>什么意味着Verilog网表?它与门级相同还是具有上下文基本定义?

我很困惑,因为在一些网站上我不知道他们是否说’这是一个使用逻辑门的Verilog代码’或’这是门级的Verilog代码’

如果有人想解释有关这个主题的更多细节,我将非常高兴:)

RTL:寄存器传输级,一种抽象硬件功能,使用always块编写,并分配可合成的语句(可以转换为门级).纯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

行为:模仿硬件的所需功能,但不一定是可综合的.只要代码生成所需的行为,就没有严格的规则.准则是保持简单和可读.行为通常用于表示模拟块,占位符代码(RTL /门未准备好)和测试平台代码.示例:时钟发生器,延迟单元.

 

always begin
  if (!clk_en && clk==1'b1) begin
    wait (clk_en);
  end
  #5 clk = ~clk;
end

RTL和Behavioral之间的关键区别在于合成的能力.如果您看到#delay,wait语句,while循环,强制/释放语句或分层引用,那就是行为.从技术上讲,有一些罕见的可疑异常,但如果这个问题,这超出了范围.

门级(又称结构):仅由门和模块描述的逻辑.不总是阻止或分配语句.这是硬件中真实门的代表.

Verilog Netlist是设计中使用的Verilog模块的集合.它可以是一个或多个文件.它可以是RTL,Behavioral和Structural的混合体.通常它主要是结构,特别是对于大型设计.

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值