Thông báo

Collapse
No announcement yet.

Thảo luận về verilog(lỗi lạ/hay)

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

  • Thảo luận về verilog(lỗi lạ/hay)

    Chào các anh em.
    Mình dùng quartus 7.0 làm một bài về máy trạng thái.
    Mình nhận thấy thế này:
    Bài số 1 mình làm chạy bình thường. 1.rar
    Sau đó ở bài số 2 mình chỉ có thêm một lệnh duy nhất là lệnh store (lưu dữ liệu từ thanh ghi A vào tập thanh ghi mình đã khai báo từ trước). 2.rar

    Mình đã biết được nguyên nhân mà không bit đúng không, mong anh em thảo luận.
    Mình phát hiện là hình như nếu mình khai báo 1 tập thanh ghi và sau đó mình dùng initial trong đó có lệnh readmemb để nhập dữ liệu từ file text1.txt vào thì sau đó mình không thể lưu dữ liệu khác được vào tập thanh ghi này nữa. Bằng chứng là ở bài 2 chỉ khác bài 1 ở chỗ mình thêm lệnh store vào thế là khi biên dịch nó nhảy lên một khung khác báo lỗi rất lạ.
    Mình không hiểu, mình initial là chạy một lần ban đầu thôi mà, tại sao sau đó mình lại không lưu dữ liệu khác vào tập thanh ghi đó được nữa.

    Mong anh em góp ý.
    Ôi cuộc đời!!!

  • #2
    Mình đã xem thiết kế của bạn,trước hết mình sẽ giải thích lỗi gây ra:
    - Nếu bạn đã học về Verilog,chắc hẳn bạn phải biết rằng không thể gán giá trị vào một thanh ghi ở hai khối always khác nhau.
    - Khối intitial của bạn coi như đã gán giá trị cho tập thanh ghi mem bên ngoài khối giải mã lệnh store cho CPU.điều này vi phạm nguyên tắc trên

    Bây giờ mình hướng dẫn bạn cách sửa :
    - Bạn xóa khối initial đi,đưa câu sau vào khối reset:
    $readmemb("Text1.txt", memory_data);
    - Mình đã test rồi và thấy OK

    Cuối cùng mình sẽ hướng dẫn bạn cách tối ưu thiết kế
    Bạn thiết kế không đúng lắm với cách thông thường :
    - Bạn khai báo reg [DATA_WIDTH-1:0]memory_data[2**ADDR_WIDTH-1:0]; làm memory thực ra FPGA sử dụng Register để làm memory (mình đã kiểm tra và thấy thiết kế của bạn không dùng memory bit),điều này gây lãng phí lớn vì FPGA có block RAM sử dụng cho mục đích này
    - Muốn sử dụng Memory, bạn nên dùng các IP core của altera hoặc xilinx rồi sử dụng cơ chế memory initialization.nếu bạn dùng quartus mình có thể hướng dẫn từng bước cho bạn.

    * Nếu bạn còn thắc mắc hay có những câu hỏi khác, bạn cứ hỏi, mình sẽ cố gắng giải thích,hoặc bạn qua luồng bên forum của sunjsc,bên đó mình phụ trách chuyên mục verilog và FPGA nên có thể giải thích rõ ràng hơn

    (http://forum.sunjsc.com/forumdisplay.php?f=327)

    Chúc vui,
    Saphina

    Comment


    • #3
      Bạn saphina1984 thân mến,
      Mình đã làm theo cách của bạn: 3.rar
      Nhưng sao khi biên dịch vẫn hiện lên bảng thông báo lỗi kì lạ đó,
      mong bạn giúp đỡ.
      Thanks.
      Ôi cuộc đời!!!

      Comment


      • #4
        hiện lên khung báo lỗi này nè bạn, mong bạn giúp đỡ.


        Internal Error: Sub-system: VRFX, File: /quartus/synth/vrfx/verific/verilog/verivalue_elab.cpp, Line: 4880
        index < NumOfElements()
        Stack Trace:
        0xCF567 : VRFX_ELABORATOR::convert_param_to_vrfx_format + 0x9B023 (synth_vrfx)
        0xCFC1A : VRFX_ELABORATOR::convert_param_to_vrfx_format + 0x9B6D6 (synth_vrfx)
        0xCF567 : VRFX_ELABORATOR::convert_param_to_vrfx_format + 0x9B023 (synth_vrfx)
        0xCDEAA : VRFX_ELABORATOR::convert_param_to_vrfx_format + 0x99966 (synth_vrfx)
        0xCB4F2 : VRFX_ELABORATOR::convert_param_to_vrfx_format + 0x96FAE (synth_vrfx)
        0x7AEBA : VRFX_ELABORATOR::convert_param_to_vrfx_format + 0x46976 (synth_vrfx)
        0x33240 : VRFX_ELABORATOR::veri_elaborate + 0x22E (synth_vrfx)
        0x32CE0 : VRFX_ELABORATOR::elaborate + 0x58 (synth_vrfx)
        0x30A92 : sgn_start + 0x2EF53 (synth_sgn)
        0x310BA : sgn_start + 0x2F57B (synth_sgn)
        0x200EC : sgn_start + 0x1E5AD (synth_sgn)
        0x28B7B : sgn_start + 0x2703C (synth_sgn)
        0x2AE0A : sgn_start + 0x292CB (synth_sgn)
        0x1112 : DllSgnStart + 0x112 (synth_sgn)
        0x1A9D : DllSgnStart + 0xA9D (synth_sgn)
        0x1B6B : sgn_start + 0x2C (synth_sgn)
        0x2E4F : (quartus_map)
        0xB4A9 : (quartus_map)

        End-trace

        Quartus II Version 7.0 Build 33 02/05/2007 SJ Web Edition
        Ôi cuộc đời!!!

        Comment


        • #5
          Mình đã thử lại file 3.rar của bạn rồi.Không hề có lỗi.
          Mình xử dụng phiên bản Quartus 7.2 Full version. Hình như bạn sử dụng phiên bản web edition.Theo lỗi mà bạn vừa nói thì có lẽ phiên bản web edition không support cách này (theo suy đoán của mình).

          Để kiểm tra suy đóan của mình,bạn thực hiên như sau :
          - Bạn thêm biến : integer i;
          - Comment dòng //$readmemb("Text1.txt", memory_data);
          - Replace bằng :
          for(i=0;i<(2**ADDR_WIDTH-1);i=i+1) begin
          memory_data[i] = i;
          end
          Nếu không có lỗi gì thì đúng như mình dự đoán, nếu vẫn lỗi cũ thì mình sợ quartus của bạn có vấn đề. Nhưng mình vẫn khẳng định rằng, mình đã dịch thử lại lần nữa và không thấy báo lỗi gì, ngoài một số nhắc nhở về mặt thiết kế

          -----------------------------------------
          CÓ gì bạn cứ post lên mình sẽ cố gắng giúp đỡ

          Chúc vui,
          Saphina

          Comment


          • #6
            Cảm ơn bạn saphina1984 nhiều, đúng là bản web edition không hỗ trợ. Mình dùng full thì chạy được.
            À, mình còn vấn đề nữa, mình đang muốn thay tập thanh ghi bằng một con RAM, mình vào megawizard chọn memory compiler rồi mình tạo ra RAM một port, sao đó mình dùng nó thây thế tập thanh ghi nhưng chưa hoạt động nữa. Bạn thân mến, bạn có thể chỉ mình chèn con ram vô chương trình cho đúng không.
            Mình làm thử mà chỉ thấy đọc được có địa chỉ đầu tiên của ram. Ở đây mình dùng file .mif để làm initial file cho ram trong qua trình khởi tạo đó bạn.
            Mong bạn chỉ giúp.4.rar
            Thanks
            Ôi cuộc đời!!!

            Comment


            • #7
              Hi ohenri,Bạn không gởi file top mà chỉ gởi file RAM nên mình không biết bạn sử dụng có đúng không.Trong module top.Bạn nên có đoạn code như thế này :
              ram reg(
              .address(your_address_name),
              .clock(your_clock_name),
              .data(your_indata_name),
              .wren(your_wren_name),
              .q(your_outdata_name)
              );


              Nhưng bạn đã đọc được địa chỉ đầu tiên nên mình nghĩ rằng bạn đã sử dụng đúng cấu trúc.
              - Mình thường dùng file .hex để init mem content cho RAM.

              - Để kiểm tra nội dung RAM có được nạp đúng.Bạn mở quartus.Chạy megawizard ,chạy edit an ... >Chuyển qua tab mem init đọc mục tiếng anh đầu tiên và đảm bảo RAM được init file mà bạn chọn.Chọn thêm allow In-system memory content .... nữa.Nhấn finish để update megaCore mới.

              - Sau đó bạn dùng Quartus mở file .mif hoặc .hex (với file of type là :memory file) kiểm tra xem nội dung file .mif có đúng như bạn mong muốn hay không.

              - Sau đó thử lại,nếu vẫn bị như vậy (khả năng này 95% vì bạn đã đọc đúng địa chỉ đầu) thì bạn nên kiểm tra lại cách truy xuất RAM của mình (99% là có vấn đề),hoặc bạn đã thay đổi nội dung trong quá trình chạy.

              - Bạn có thể kiểm tra nội dung RAM trong quá trình đang chạy bằng công cụ in-system memory content editor\hoac sử dụng signaltap để debug quá trình thực sự đang diễn ra trong Chip

              - Một cái nữa bạn có thể thử và nhắc nhở nên sửa cho dù nó không giúp ích được cho bạn trường hợp này.Đó là đường dẫn của project của bạn sử dụng với Quartus của bạn có phải là :

              .... ./Processor16bit Quartus/***.v

              Quartus rất dễ sinh lỗi khi đường dẫn có khoảng trắng.Bạn chú ý điều này sẽ rất có lợi cho mình sau này đấy.

              PS:Nếu vẫn không thành công bạn nên gởi cho mình file top để mình kiểm tra.Hoặc mô tả chi tiết hơn.

              Chúc vui,
              Saphina
              Last edited by saphina1984; 24-08-2008, 11:03.

              Comment


              • #8
                Thanks bạn saphina1984 nhiều lắm.
                Cảm ơn bạn đã chỉ rất tận tình, nhưng mình thây khối Ram không được bạn ơi, lần này mình gởi đủ các file để bạn xem xét dùm. File ở đây 5.rar

                Sao nó chỉ đọc được lệnh đầu tiên là lệnh nhập vào thôi.
                Mong bạn tham khảo giúp đỡ.
                Thanks bạn nhiều.
                Ôi cuộc đời!!!

                Comment


                • #9
                  Hình như bạn không mô phỏng khi thiết kế thì phải. Mình đã viết testbench để test module CPU của bạn, mình có gởi kèm file hình thể hiện vì sao bạn chỉ đọc được giá trị E000 (lệnh đầu tiên).
                  Bạn nên đọc bài hướng dẫn thiết kế module của mình : http://forum.sunjsc.com/showthread.php?t=262

                  Nguyên nhân là vì : altera memory sẽ output ra nội dung trễ 2 chu kỳ sau khi có địa chỉ,nên lúc bạn đọc thì giá trị cũ lúc bạn reset addr = 0,bạn xem hình mình gởi kèm sẽ thấy.
                  PS : CPU của bạn thiết kế vậy chạy cho vui thì được,nếu bạn thích + muốn thiết kế lõi CPU/DSP thực sự thì liên lạc với mình, mình hướng dẫn. Vì mình đã làm qua vài lần và mình cũng có open core của nhiều CPU rất đáng để học.
                  Attached Files
                  Last edited by saphina1984; 05-09-2008, 17:56.

                  Comment


                  • #10
                    Mình cũng thấy cpu mình thiết kế không hay lắm, không biết đàn anh (chị) saphina1984 có thể chỉ mình cách thiết kế hay hơn hay chỉ mình một số tài liệu tham khảo nữa.
                    Mong saphina1984 giúp đỡ, mình thực sự mê cái này.
                    ntsonvldt@gmail.com
                    Ôi cuộc đời!!!

                    Comment


                    • #11
                      mình muốn hỏi khai báo mảng trong verilog thi khai báo như thế nào nhỉ

                      Comment


                      • #12
                        mình cũng muốn biết về thiết kế CPU mong bạn giúp mình đựoc không
                        email của mình là tapthe12a42002@yahoo.com
                        cám ơn bạn nhiều
                        best regard

                        Comment


                        • #13
                          anh ơi em muốn tạo ram rồi đưa ảnh BMP theo kiểu file mif đưa vào ram mà dang ko biết làm!ảnh bmp giờ tạo file mif làm sao anh!rồi tạo khối ram xong làm sao mà đưa cái mì đó vào!

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...
                          X