2012-01-18 66 views
9

Có sự khác biệt giữaSự khác biệt giữa @ (posedge Clk); a <= 1'b1; và @ (posedge Clk) a <= 1'b1;

@(posedge Clk); 
    a<= 1'b1; 

@(posedge Clk) 
    a<= 1'b1; 

Lưu ý các dấu chấm phẩy sau CLK. Tôi đã xem các dòng mã tương tự khi tôi duyệt qua một cái testbench. Tôi đã làm một số thí nghiệm đơn giản và tôi không thể tìm thấy bất kỳ sự khác biệt nào trong quá trình mô phỏng. Trình tự thực thi cho đoạn mã có tuân theo các dòng này thay đổi theo bất kỳ cách nào do sự hiện diện/vắng mặt của dấu chấm phẩy không?

Trả lời

10

Bạn đúng - không có sự khác biệt về hành vi.

Phiên bản dấu chấm phẩy là: Đợi. Làm cái này. Phiên bản không dấu chấm phẩy là: Đợi sau đó thực hiện việc này. Đôi khi bạn sẽ thấy hình thức này được sử dụng trong một lớp lót:

@(posedge Clk) a<= 1'b1; 
12

Cú pháp BNF cho bất kỳ tuyên bố thủ tục về bản chất là

statement_item := 
     {procedural_timing_control} statement; 

Điều này có nghĩa bạn có thể có 0 hoặc nhiều điều khiển thời gian trước bất kỳ tuyên bố. Trong ví dụ của bạn @(posedge Clk) là điều khiển thời gian và a<= 1'b1; là tuyên bố.

Nếu ví dụ của bạn nằm trong một ngã ba/tham gia, sẽ có sự khác biệt về hành vi vì trước đây là hai câu lệnh; sau đó là một tuyên bố.

fork 
    @(posedge Clk); a<1'b1; 
join 

Trong trường hợp này, 2 báo cáo được khởi động song song - a sẽ không chờ cho posedge được giao.

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