Thông báo

Collapse
No announcement yet.

Hỏi về Verilog

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Hỏi về Verilog

    Xin chào các anh chị tiền bối, em mới chập chững bước vào học Verilog, và diễn đàn dientuvietnam.net có rất nhiều cao thủ.
    Em có một số câu hỏi chưa được rõ lắm, mong các tiền bối giúp đỡ.
    Trong Verilog có một phần nhỏ nhưng em nghĩ nó sẽ là quan trọng, đó là Các bẫy thiết kế cần tránh (Design Traps to Avoid),
    1 Tránh tham chiếu cùng một biến trong nhiều hơn một chu kỳ hành vi
    2 Không bao giờ gán giá trị cho cùng một biến trong nhiều hành vi
    Điều này các anh có thể cho em ví dụ minh họa để dễ hiểu hơn cho 2 ý này không ạ ?
    Em xin chân thành cảm ơn./

  • #2
    Nguyên văn bởi hoangclick Xem bài viết
    Xin chào các anh chị tiền bối, em mới chập chững bước vào học Verilog, và diễn đàn dientuvietnam.net có rất nhiều cao thủ.
    Em có một số câu hỏi chưa được rõ lắm, mong các tiền bối giúp đỡ.
    Trong Verilog có một phần nhỏ nhưng em nghĩ nó sẽ là quan trọng, đó là Các bẫy thiết kế cần tránh (Design Traps to Avoid),
    1 Tránh tham chiếu cùng một biến trong nhiều hơn một chu kỳ hành vi
    2 Không bao giờ gán giá trị cho cùng một biến trong nhiều hành vi
    Điều này các anh có thể cho em ví dụ minh họa để dễ hiểu hơn cho 2 ý này không ạ ?
    Em xin chân thành cảm ơn./
    Theo kinh nghiệm thì cứ hiểu bản chất vấn đề thì không có gì phải lo lắng:
    1) mình thấy chẳng có vấn đề gì cả ... không biết nguyên văn của câu đó là gì
    2) Khi mô tả phần cứng, đặc biệt digital circuit, bạn không thể "gán" giá trị của 1 biến tại 2 chỗ vì mỗi cho sẽ sinh ra một "mạch điện" có đầu ra là biến của bạn, mà 2 mạch điện có đầu ra chập lại là không hợp lệ, sẽ bi short-circuit.

    ví dụ
    always@(*)
    reg_a <= reg_b & reg_c
    always@(*)
    reg_a <= reg_d | reg_e

    phần code này là sai vì 1 process sẽ sinh ra cổng "and" đầu ra là reg_a, 1 process khác sinh ra cổng "OR" đầu ra cũng nối với reg_a
    ==> sai khi synthesis (tuy nhiên, khi mô phỏng sẽ không báo lỗi)

    Comment


    • #3
      chắc tại em dịch chưa đúng, bản chất của câu hỏi 1 là đây anh,
      ...avoid referencing the same variable in more than one cyclic (always) behavior. when variables are referenced in more than one behavior, there can be races in the software, and the postsynthesis simulated behavior may not match the presynthesis behavior.
      Never assign value to the same variable in multiple behaviors.
      Anh giải thích kỹ hơn về phần này cho em với ạ

      Comment


      • #4
        ...avoid referencing the same variable in more than one cyclic (always) behavior. when variables are referenced in more than one behavior, there can be races in the software, and the postsynthesis simulated behavior may not match the presynthesis behavior.
        Phần này không cần thiết bạn phải làm theo.

        Ví dụ như bạn có đoạn code

        always@()
        if(A==1) B = 1b'1; else B = 1'b0;

        always@()
        if(A==1) C = 1'b1; else C = 1'b0;

        Bạn reference biến A ở 2 phần này, nhưng vì 2 phần hoàn toàn độc lập nên sẽ chẳng có vấn đề gi.
        - Khi synthesis, phần mềm sinh ra 2 mạch điện có đầu ra là B và C, thay đổi theo A
        - Khi mô phỏng, khi A thay đổi thì B và C sẽ thay đổi. Ý người ta muốn nói là simulator có thể sẽ thực hiện gán B trước hoặc gán C trước, mà không chắc chắn được là sẽ gán phần nào trước.

        Nếu bạn thay đổi chút như sau:
        always@()
        if(A==1) B = 1b'1; else B = 1'b0;

        always@()
        if(A==1) C = B;

        Giả sử A = 0, B = 0, C = 0;
        Bay giờ A chuyển từ 0 lên 1:
        - tình huống 1: simulator thực hiện gán B trước B = 1, thưc hiện gán C, C = 1
        - tinh huống 2 : simulator thực hiện gán C trước, C = 0 vì B = 0, sau đó gán B = 1, vì B thay đổi nên phải thưc hiện gán C một lần nữa C = 1.

        Phần mềm synthesis sẽ đọc code của bạn và sẽ sinh ra mạch
        Phần mềm simulator sẽ đọc code của bạn và thực hiện các dòng lệnh để mô phỏng phần cứng
        Đôi khi kết quả cuối cùng sẽ không giống nhau.

        Mình khuyên bạn nên code Verilog bằng cách vẽ mạch trước, sẽ ít sai hơn.

        Comment


        • #5
          Phần thứ 2 như mình đã nói
          Mỗi vòng always sẽ chạy song song và sẽ được dịch ra thành 1 mạch điện có đầu ra là biến giá trị mà bạn muốn gán

          always@*
          A <= B & C;
          ==> sinh ra cổng and có đầu ra là A, đầu vào là B,C
          always@(*)
          A <= D | E;
          ==> sinh ra cổng or có đầu ra là A, đầu vào là D,E

          Khi synthesis:
          Đầu ra 2 cổng sẹ bị chập lại ==> lỗi multiple driver chập mạch nếu một cổng cho kết quả 1, một cổng cho kết quả 0

          Khi mô phỏng:
          Nếu B hoac C thay đổi, A = B & C
          nếu D hoặc E thay đổi, A = D|E
          Kết quả tùy thuộc vào thời điềm D, E, B, C thay đổi

          Comment


          • #6
            Nếu bạn cảm thấy mình nói lung tung không hiểu gì hết (very likely ) thì bạn tạm gác phần này qua một bên, làm vài bài lab, viết vài module bằng Verilog đã
            Btw, bạn đọc sách gì vậy?

            Comment


            • #7
              Em đọc sách Advanced Digital Design with the Verilog HDL của Michael D. Ciletti Anh ạ,
              sách ông ấy dài lắm, và viết cũng khá chi tiết, E cũng biết khá nhiều sách về Verilog nhưng E chỉ tham khảo rồi đọc một quyển thôi, đọc nhiều lan man lắm, Anh trước học Verilog thì đọc sách nào vậy ạ?

              Comment


              • #8
                A, em tải quatus II 9.0 trên diễn đàn mình nhưng lại ko có ***** (link ***** bị die), sau đó tải bản Web Edition về nhưng khi Run thì báo lỗi, toàn lỗi đăng ký, mà mạng nhà E lại chập chờn nữa, Anh có bản Quatus nào chạy ok thì share trên Mediafire cho em với ạ,hi

                Comment


                • #9
                  Nguyên văn bởi jefflieu Xem bài viết

                  Mình khuyên bạn nên code Verilog bằng cách vẽ mạch trước, sẽ ít sai hơn.
                  Ghi nhận câu này của Anh, Anh giải thích rất kỹ mà, em dốt lâp trình nhưng đọc lời giải thích của A cũng hiểu phần nào rồi.

                  Comment


                  • #10
                    Àh mình cũng có cuốn đó kế bên đây , thấy chỗ bạn đọc rồi, 6.14, sao ông đó viết phần này ít vậy không biết. Bạn bỏ quả phần này cũng ok.
                    Cuốn này tốt đấy, có hình vẽ mạch điện cho bạn hiểu code của bạn sẽ sinh ra mạch như thế nào ...
                    Lúc học Verilog mình học lỏm thôi, học trên trang web này Welcome To Verilog Page
                    Mình lấy cuốn này làm reference, chưa bao giờ đọc hết cuốn này...
                    Bạn tải Quartus Webpack đi và modelsim nữa, đâu cần ***** làm gì. Bản subscription chỉ dùng cho những FPGA khủng như Stratix mới cần.

                    Comment


                    • #11
                      cái bản Quatus Webpack E không thấy trên Altera, để Em search xem thế nào rồi hỏi anh,
                      thì ra Anh cũng có quyển của ông Micheal D. này,hi

                      Comment


                      • #12
                        có đoạn này ở phần 6.15 của sách E cũng chưa hiểu, mong anh giải thích giùm E với ạ
                        . It also recommended that that a module contain no more than one state machine.
                        This will allow the synthesis tool to optimize th logic for a machine without the influence of extraneous logic. Logic in different clock domains (e.g., with interacting state machines) should be encapsulated in separate blocks of the partition. Synchronizers should be used where signals cross betwent the domains

                        Comment


                        • #13
                          chưa học đã thấy mệt mỏi rồi,hic
                          Last edited by hoangclick; 08-10-2012, 16:56.

                          Comment


                          • #14
                            Anh @jefflieu cho em hỏi mấy câu nữa được không ạ?
                            0. Tại sao trong một module không được chứa nhiều hơn một máy trạng thái (trích: ..It also recommended that a module contain no more than one state machine)
                            1. Tại sao khi ta phân chia thiết kế thì ta phải nhóm các thanh ghi và các cổng logic lại? (trích: ..The partition of design should group registers and their logic, so that their control logic might be implemented efficiently.)
                            2. Ranh giới Module được duy trì trong tổng hợp có nghĩa là gì ạ <<trích: ..Module boundaries are preserved in synthesis (i.e., optimized separately) so combinational logic should not be distributed between modules.>>

                            Comment


                            • #15
                              Nguyên văn bởi hoangclick Xem bài viết
                              Anh @jefflieu cho em hỏi mấy câu nữa được không ạ?
                              0. Tại sao trong một module không được chứa nhiều hơn một máy trạng thái (trích: ..It also recommended that a module contain no more than one state machine)
                              Cai recommendation này a không biết ông đó lấy đâu ra. Không nghe Altera và Xilinx nói gì về vấn đề này hết. Cái này có lẽ phụ thuộc nhiều vào compiler. E không nên quá bận tâm

                              1. Tại sao khi ta phân chia thiết kế thì ta phải nhóm các thanh ghi và các cổng logic lại? (trích: ..The partition of design should group registers and their logic, so that their control logic might be implemented efficiently.)
                              Registers và các combinational logic nên group lại trong module để compiler nó optimize dễ dàng hơn vì lí do bên dưới

                              2. Ranh giới Module được duy trì trong tổng hợp có nghĩa là gì ạ <<trích: ..Module boundaries are preserved in synthesis (i.e., optimized separately) so combinational logic should not be distributed between modules.>>
                              Ranh giới giữa module được duy trì trong tổng hợp nghĩa là ví dụ ở module a có:
                              OutputA = ~ InputA;
                              Ở module B có :
                              OutputB = ~InputB;
                              Giờ nổi OutputA vô input B

                              Nếu mà ranh giới giữa 2 module được duy trì, bạn sẽ có 2 cổng not trong 2 module. Nếu mà ranh giới giữa 2 module không dược duy trì (flattened) thì compiler tự động tối ưu hóa 2 công not mất tiêu luôn.
                              Bây giờ các compiler của FPGA mặc định là không duy trì các boundary, nghĩa là thiết kế bi "flattened" .... trừ khi bạn muốn duy trì thì nó sẽ duy trì.

                              Khi flattened thì sẽ dể tối ưu hóa (optimize) hơn, nhưng lúc debug sẽ khó hơn vì các tín hiệu bị đổi tên khá nhiều.


                              Khi chuyển một tín hiệu từ 1 clock domain sang một clock domain khác phải cẩn thận vì điều tối kị của flip-flop là tín hiệu đển flip-flop không thỏa thời gian set-up

                              Comment

                              Về tác giả

                              Collapse

                              hoangclick Tìm hiểu thêm về hoangclick

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X