2015-04-23 14 views
6

Tôi đang cố gắng hiểu đầy đủ sự khác biệt giữa mức độ trừu tượng của Verilog, tôi nhận được mô tả của từng cấp nói nhưng tôi vẫn không thể có được nó khi chơi.Sự khác biệt giữa hành vi, RTL và cấp cổng

Đối với trường hợp này, tôi sẽ dán một số mã Verilog và những gì tôi nghĩ về họ:

  1. Các mã sau đây là trong hành vi Level.

    always @ (a or b or sel) 
        begin 
        y = 0; 
        if (sel == 0) begin 
         y = a; 
        end else begin 
        y = b; 
        end 
    end 
    
  2. này (chỉ là ví dụ) là ở Cổng Cấp

    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. Tôi không biết nếu mã này là trong RTL hoặc Cổng Cấp (Tôi hy vọng rằng luôn từ khóa làm RTL này và không Cổng Cấp)

    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 
    

tôi đã biết rằng initial beginend không được tổng hợp và chỉ được sử dụng để thử nghiệm. Bây giờ tôi có 2 câu hỏi

  1. Mã thứ ba (và thứ hai) là RTL hoặc Cổng-Leve? Điều gì sẽ là một ví dụ mã RTL tốt? Tôi tìm thấy điều này RTL Code Example nhưng thực sự là RTL? Đối với tôi, nó trông giống như mức độ hành vi.

  2. Điều gì có nghĩa là danh sách mạng Verilog? Nó giống như cấp cổng hay nó có định nghĩa cơ sở ngữ cảnh?

Tôi đang bối rối bởi vì trong một số trang web Tôi không biết nếu họ đang nói 'đây là một mã Verilog đó là sử dụng cổng logic' hoặc 'này là một mã Verilog trong cửa cấp'

tôi sẽ rất hạnh phúc nếu ai đó muốn giải thích chi tiết hơn về chủ đề này :)

Trả lời

10

RTL: Đăng ký-Chuyển giao-Level, một chức năng phần cứng trừu tượng bằng văn bản với always khối và assign tuyên bố rằng là synthesizable (có thể được dịch sang mức cổng). RTL thuần túy không khởi tạo mô-đun phụ. RTL có thể chứa các mô-đun phụ để hướng dẫn bộ tổng hợp. Cấu trúc RTL (ofter vẫn được gọi là RTL) là một mô-đun có chứa các mô-đun RTL khác. Ví dụ: FSM (hữu hạn-Nhà Máy)

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 

hành vi: bắt chước chức năng mong muốn của phần cứng nhưng không nhất thiết synthesizable. Không có quy tắc nghiêm ngặt miễn là mã tạo ra hành vi mong muốn. Hướng dẫn là giữ cho nó đơn giản và dễ đọc. Hành vi thường được sử dụng để đại diện cho khối tương tự, mã giữ chỗ (RTL/cổng không sẵn sàng), và mã testbench. Ví dụ: bộ tạo xung nhịp, các ô trễ.

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

Sự khác biệt chính giữa RTL và Behavioral là khả năng tổng hợp. Đó là hành vi nếu bạn thấy các câu hỏi về độ trễ #, wait, while vòng, force/release hoặc tham chiếu phân cấp. Về mặt kỹ thuật có một số trường hợp ngoại lệ hiếm có, nhưng điều đó nằm ngoài phạm vi nếu câu hỏi này.

Cổng cấp (còn gọi là Kết cấu): Logic được mô tả bằng cổng và mô-đun. Không có số báo always hoặc assign. Đây là một đại diện của các cổng thực trong phần cứng.

Verilog Netlist là tập hợp các mô-đun Verilog được sử dụng trong thiết kế. Nó có thể là một hoặc nhiều tệp. Nó có thể là một kết hợp của RTL, hành vi và cấu trúc. Thông thường nó chủ yếu là cấu trúc, đặc biệt là cho các thiết kế lớn.

+0

soo, từ các ví dụ tôi thấy, 2 mã sẽ là cổng cấp? – lcjury

+0

Đó là một chút của một khu vực mơ hồ mà không có bối cảnh đầy đủ của thiết kế. Với chỉ là: tôi gọi nó là cấu trúc; thường không chỉ có một cá thể mô-đun. Do tên mô-đun 'test' được ngụ ý đây là một bộ khai thác thử nghiệm mà rơi nhiều hơn trong định nghĩa hành vi. – Greg

2
  1. mức hành vi.
  2. RTL cấp (không phải cổng mức, nhưng mức độ nguyên thủy.
  3. Một hỗn hợp làm việc mô-đun/testbench, tất cả bao bọc trong một mô-đun duy nhất. Không phải là phương pháp tốt nhất để thiết kế với Verilog, nhưng sẽ là . OK cho một ví dụ giảng dạy Trong thực tế, ví dụ này thực sự là hai mô-đun:

các testbench, có thể được coi là hành vi, thậm chí nếu nó sử dụng RTL mã hóa để nhanh chóng các mô-đun có nghĩa là sẽ được thử nghiệm vào regs và dây dẫn mà ổ đĩa thử nghiệm lái xe:

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 

Các đơn vị được kiểm tra (UUT) đang được thử nghiệm, mà đó là một mô-đun như thế này (mà rõ ràng là một mức RTL mức -gate mô-đun 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 

Đó là sự hiểu biết của tôi rằng một module mức RTL là một mô-đun trong đó các phương trình logic được giải thích. Mô-đun hành vi có các quá trình (trong Verilog sử dụng các khối always, mặc dù các phương trình logic có thể được sử dụng bên trong các khối đó). Bất kỳ thiết kế Verilog không tầm thường nào đều có cả hai.

+0

Rất tiếc (vấn đề tiếng Anh), dff_from_nand của bạn là RTL hoặc cấp cổng? – lcjury

+0

(Tôi có vấn đề tiếng Anh quá;)) Thực hiện cụ thể này sẽ là một thực hiện cấp cửa khẩu, mà có thể phục vụ như một netlist –

Các vấn đề liên quan