Đối với một số sự kết hợp của các tham số, trình mô phỏng và phong cách mã hóa RTL, độ trễ của khối này trong mô phỏng làm thay đổi độ trễ dự kiến bởi - một đồng hồ. Phần cứng thực tế thể hiện độ trễ mong đợi.
Ví dụ, hành vi này sẽ được nhìn thấy, nếu đồng hồ điều khiển khối DSP là phiên bản bị trì hoãn của đồng hồ tạo ra dữ liệu đầu vào, do đó giới thiệu độ trễ mô phỏng cho đồng hồ đầu vào nhiều hơn so với dữ liệu đầu vào.
Để giải quyết vấn đề này, bạn phải đảm bảo rằng độ trễ giữa đồng hồ tạo ra dữ liệu đầu vào cho khối DSP và đồng hồ đầu vào của khối DSP, được cân bằng bởi độ trễ trên dữ liệu đầu vào. Ngoài ra, hãy đảm bảo rằng dữ liệu đầu vào sẽ đến vào thời điểm tuyệt đối sau này hoặc thời gian trễ của delta mô phỏng sau này so với đồng hồ đầu vào của khối DSP.
Lưu ý rằng những thứ như nhiều báo cáo chuyển nhượng hơn trên đường dẫn đồng hồ so với đường dẫn dữ liệu sẽ gây ra sự khác biệt độ trễ đồng bằng mô phỏng giữa các đường dẫn đó.
Để thực hiện điều này, hãy sửa đổi thiết bị kiểm tra của bạn để:
- Đảm bảo rằng các đầu vào tạo đồng hồ cho khối DSP riêng chính xác là tín hiệu tương tự như đầu vào đồng hồ cho khối DSP riêng.
- Nếu #1 không khả thi, hãy trì hoãn dữ liệu đầu vào liên quan đến đồng hồ.
Ví dụ, hãy xem xét mã RTL ban đầu sau:
RTL gốc:
clk_gen: quy trình
Bắt đầu
clk_orig <= \'0\';
chờ 5 ns;
clk_orig <= \'1\';
chờ 5 ns;
quy trình kết thúc;
...
nếu (rising_edge(clk_orig)) thì
ax <= ax 1;
ay <= ay - 1;
kết thúc nếu
mac_test_bad_style: mult_acc
bản đồ cổng (
...
ax => std_logic_vector(ax), -- [in]
ay => std_logic_vector(ay), -- [in]
clk => ("00" & clk_orig), -- [in]
resulta => resulta2, -- [out]
...
);
resulta2 sẽ hiển thị độ trễ thấp hơn một đồng hồ so với dự kiến. Lưu ý rằng kết hợp của "00 & clk" trong gán cổng clk của hệ số nhân bổ sung thêm độ trễ lệch mô phỏng từ "clk_orig" tạo ra dữ liệu đầu vào.
Giải pháp có thể bao gồm:
Ví dụ 1, Đề xuất: Sử dụng đồng hồ 3 bit xuyên suốt
Bạn có thể tạo ra đồng hồ 3-bit của hệ số nhân trực tiếp và sử dụng bit hoạt động để đồng hồ dữ liệu đầu vào:
clk_gen: quy trình
Bắt đầu
clk3bit <= \'000\';
chờ 5 ns;
clk3bit <= \'001\';
chờ 5 ns;
quy trình kết thúc;
...
nếu (rising_edge(clk3bit(0)) thì
ax <= ax 1;
ay <= ay - 1;
kết thúc nếu
mac_test_bad_style: mult_acc
bản đồ cổng (
...
ax => std_logic_vector(ax), -- [in]
ay => std_logic_vector(ay), -- [in]
clk => (clk_3bit), -- [in]
resulta => resulta2, -- [out]
...
);
Ví dụ 2, Khuyến nghị thay thế: thêm độ trễ tương ứng vào dữ liệu đầu vào
Tuyên bố \'clk => ("00" & clk_orig)\' khiến cổng \'clk" có độ trễ lệch mô phỏng bổ sung từ \'clk_orig\' đang điều khiển dữ liệu. Để khắc phục điều này, bạn có thể sử dụng quy trình clk_gen gốc và chỉ thêm độ trễ vùng mô phỏng vào dữ liệu với các báo cáo chuyển nhượng.
clk_gen: xử lý (giống với bản gốc)
ax_del <= ax;
ay_del<=ay;
mac_test_bad_style: mult_acc
bản đồ cổng (
...
ax => std_logic_vector(ax_del), -- [in]
ay => std_logic_vector(ay_del), -- [in]
clk => ("00" & clk_orig), -- [in]
resulta => resulta2, -- [out]
...
);