2015-04-23 84 views
6

我試圖完全理解Verilog的抽象級別之間的差異,我得到每個級別的描述,但我仍然無法在遊戲中獲得它。行爲,RTL和門級之間的區別

對於這種情況,我會貼一些的Verilog代碼,我想他們是什麼:

  1. 下面的代碼是在行爲級。

    always @ (a or b or sel) 
        begin 
        y = 0; 
        if (sel == 0) begin 
         y = a; 
        end else begin 
        y = b; 
        end 
    end 
    
  2. 這(只是一個例子)是在門級

    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 
    
  3. 我不知道如果這個代碼是在RTL或門級(我期望總是關鍵詞讓這個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 beginend不可合成,僅用於測試。現在我有兩個問題

  1. 第三個(和第二個)代碼是RTL還是Gate-Leve?什麼是一個很好的RTL代碼示例?我發現這RTL Code Example,但這真的是RTL?對我來說,它看起來像行爲水平。

  2. Verilog網表是什麼意思?它與門級相同還是具有上下文基礎定義?

我很困惑,因爲在一些網站,我不知道,如果他們說「這是使用邏輯門一個Verilog代碼」或「這是門級一個Verilog代碼」

我會很高興,如果誰願意​​別人解釋這個話題:)

回答

10

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 

行爲:模仿硬件的所期望的功能,但不一定可合成。只要代碼生成期望的行爲,就沒有嚴格的規則。指導方針是保持簡單和可讀性。行爲通常用於表示模擬塊,佔位符代碼(RTL /門未準備就緒)和測試臺代碼。例如:時鐘發生器,延遲單元。

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

RTL和行爲之間的關鍵區別是合成能力。如果您看到#延遲,wait語句,while循環,force/release語句或分層引用,則這是行爲方式。從技術上講,有一些罕見的可能的例外情況,但如果這個問題超出範圍。

門級(又名結構):僅由門和模塊描述的邏輯。沒有always塊或assign陳述。這是硬件真實閘門的代表。

Verilog 網表是設計中使用的Verilog模塊的集合。它可以是一個或多個文件。它可以是RTL,Behavioral和Structural的組合。通常它主要是結構性的,特別是對於大型設計。

+0

soo,從我所示的例子中,第二個代碼將是門級? – lcjury

+0

這是一個沒有設計完整背景的模糊區域。只有這樣:我會稱之爲結構性的;並不是經常只有一個模塊實例。由於模塊名稱「test」暗示這是一個測試工具,它更多地落在行爲定義中。 – Greg

2
  1. 行爲層面的更多細節。
  2. RTL水平(不必是門級,但原始的水平。
  3. 混合工作模塊/測試平臺,全封閉式在單個模塊中。不是最好的方法與Verilog設計,但將是。確定了教學例子其實,這個例子實際上是兩個模塊:

測試平臺,可視爲行爲,即使它使用RTL編碼實例化將要測試的REG模塊和測試臺驅動的電線:

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水平 - 門極電平actually-模塊):

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設計都將具有兩者。

+0

對不起(英文問題),你的dff_from_nand是RTL還是門級? – lcjury

+0

(我也有英文問題;))這個特定的實現將是一個門級的實現,它可以作爲一個網表 –