CỘNG ĐỒNG VI MẠCH BÁN DẪN VIỆT NAM – CÔNG TY VSRD

DIENTU.VN & DIENTUVIETNAM.VN Tập trung nghiên cứu và phát triển Semiconductor, từ thiết kế vi mạch đến ứng dụng thực tế.

Chuyên sâu Lập trình FPGA, triển khai thuật toán phần cứng tốc độ cao cho hệ thống nhúng và AI.

Giải pháp Camera tích hợp FPGA

Giải pháp camera tích hợp FPGA cho phép xử lý hình ảnh trực tiếp ở mức phần cứng, đáp ứng yêu cầu độ trễ thấp, tốc độ cao và độ ổn định cao so với xử lý bằng CPU/GPU truyền thống.

Hệ thống phù hợp cho các ứng dụng AI Vision, giám sát thông minh, công nghiệp, giao thông, với khả năng tùy biến pipeline xử lý ảnh, nén video và tăng tốc thuật toán theo yêu cầu thực tế.

Làm sao để mô phỏng...
 
Chia sẻ:
Notifications
Clear all

Làm sao để mô phỏng và synthesise một module verilog

1 Bài viết
1 Thành viên
0 Reactions
162 Lượt xem
(@admin)
Bài viết: 178
Thành Viên Admin
Topic starter
 

1) Mô phỏng Verilog là gì?

Mô phỏng = chạy module bằng testbench trên PC để kiểm tra đúng/sai trước khi nạp FPGA.
Bạn sẽ xem waveform (dạng sóng), kiểm tra reset, timing, trạng thái…

Cần gì để mô phỏng?

  • File RTL: dut.v (design under test)

  • File testbench: tb.v (tạo clock/reset/input và quan sát output)

Ví dụ testbench tối giản

 
`timescale 1ns/1ps

module tb;
  reg  clk = 0;
  reg  rst_n = 0;
  wire out;

  // tạo clock 100MHz => chu kỳ 10ns
  always #5 clk = ~clk;

  // gọi module cần test
  my_module dut (
    .clk   (clk),
    .rst_n (rst_n),
    .out   (out)
  );

  initial begin
    // reset
    #20 rst_n = 1;

    // chạy một lúc
    #500;
    $finish;
  end
endmodule

✅ Tips nhanh:

  • Luôn có timescale

  • Clock tạo bằng always #...

  • Reset rõ ràng (đặc biệt cho sequential logic)


2) Synthesise (tổng hợp) là gì?

Synthesis = chuyển Verilog RTL thành netlist cổng logic + FF + LUT + BRAM… phù hợp FPGA.

Synthesis không “chạy thời gian” như simulation. Nó biến code thành phần cứng thật.

Code nào synthesize được?

always @(posedge clk) (FF/Registers)
always @(*) + gán đầy đủ (combinational)
assign (logic tổ hợp)

#delay, initial (thường chỉ dùng cho simulation, trừ vài FPGA hỗ trợ init FF nhưng không nên dựa vào)
$display, $finish (system task chỉ cho mô phỏng)


3) Quy trình mô phỏng và synthesize trong Vivado (chuẩn)

A. Mô phỏng (Vivado Simulator)

  1. Create Project

  2. Add Sources → thêm *.v (Design Sources)

  3. Add Simulation Sources → thêm tb_*.v

  4. Flow Navigator → Run Simulation → Run Behavioral Simulation

  5. Xem waveform:

    • Add signals (hoặc “Add to Wave”)

    • Run / Restart / Zoom

✅ Behavioral simulation: kiểm tra logic cơ bản (chưa có delay routing).

B. Tổng hợp + Implement

  1. Flow Navigator → Run Synthesis

  2. Xem:

    • Utilization (LUT/FF/BRAM)

    • Schematic (netlist)

  3. Run Implementation

  4. Generate Bitstream

Nếu bạn dùng board (PYNQ-Z2) thì còn bước thêm:

  • Constraints file .xdc (gán chân LED, clock, button…)


4) “Checklist” lỗi hay gặp khi synthesize

(1) Latch ngoài ý muốn

Nguyên nhân: always @(*) nhưng không gán đủ nhánh.
Ví dụ sai:

 
always @(*) begin
  if (en) y = a;  // thiếu else => latch
end

Cách đúng:

 
always @(*) begin
  y = b;          // default
  if (en) y = a;
end

(2) Reset không đúng kiểu

  • Nếu bạn dùng reset đồng bộ: đặt trong posedge clk

  • Nếu reset bất đồng bộ: dùng or negedge rst_n

Ví dụ reset bất đồng bộ:

 
always @(posedge clk or negedge rst_n) begin
  if (!rst_n) q <= 0;
  else        q <= d;
end

(3) Dùng “clock chia” làm clock thật

Trên FPGA, tốt nhất dùng clock enable hoặc MMCM/PLL, tránh tự tạo clock bằng logic (trừ khi bạn hiểu rõ clocking/routing).


5) Mẹo nhanh để mô phỏng đúng “như phần cứng”

  • Đảm bảo reset/khởi tạo rõ ràng (FF trong FPGA không phải lúc nào cũng giống “initial”).

  • Với input từ nút nhấn: mô phỏng cả debounce nếu cần.

  • Khi cần sát thực tế timing: chạy Post-Implementation Timing Simulation (nâng cao).


Chiến Thần IV Tạp Dịch

 
Đã đăng : 24/12/2025 16:20