2012-06-13 18 views
6

Gần đây, tôi đã nhìn thấy một số D flip-flop mã RTL trong Verilog như thế này:cách tốt hơn để mã hóa một D flip-flop

module d_ff(
      input d, 
      input clk, 
      input reset, 
      input we, 
      output q 
    ); 

    always @(posedge clk) begin 
      if (~reset) begin 
        q <= 1'b0; 
      end 
      else if (we) begin 
        q <= d; 
      end 
      else begin 
        q <= q; 
      end 
    end 
    endmodule 

Liệu các tuyên bố q <= q; cần thiết?

+2

Có lẽ bạn được yêu cầu đặt kết quả đầu ra trong trường hợp _all_? – paxdiablo

Trả lời

7

Liệu các tuyên bố q < = q; cần thiết?

Không, và trong trường hợp ASIC, nó thực sự có thể làm tăng diện tích và mức tiêu thụ điện năng. Tôi không chắc chắn như thế nào hiện đại FPGAs xử lý này. Trong quá trình tổng hợp, công cụ sẽ thấy câu lệnh đó và yêu cầu q được cập nhật trên mọi cạnh đồng hồ tích cực. Nếu không có mệnh đề cuối cùng khác, công cụ này miễn phí chỉ cập nhật q bất cứ khi nào các điều kiện nhất định được đáp ứng.

Trên ASIC, điều này có nghĩa là công cụ tổng hợp có thể chèn một cổng đồng hồ (miễn là thư viện có một) thay vì mux. Đối với một DFF đơn, điều này thực sự có thể tồi tệ hơn vì một cổng đồng hồ thường lớn hơn nhiều so với một mux nhưng nếu q là 32 bit thì tiết kiệm có thể rất quan trọng. Các công cụ hiện đại có thể tự động phát hiện nếu số lượng DFF sử dụng một phép chia sẻ thỏa mãn một ngưỡng nhất định và sau đó chọn một cổng đồng hồ hoặc mux phù hợp.

With final else clause

Trong trường hợp này công cụ cần 3 muxes cộng thêm việc định tuyến

always @(posedge CLK or negedge RESET) 
    if(~RESET) 
    COUNT <= 0; 
    else if(INC) 
    COUNT <= COUNT + 1; 
    else 
    COUNT <= COUNT; 

Without final else clause

Dưới đây công cụ sử dụng một cổng đồng hồ duy nhất cho tất cả các DFFs

always @(posedge CLK or negedge RESET) 
    if(~RESET) 
    COUNT <= 0; 
    else if(INC) 
    COUNT <= COUNT + 1; 

Images from here

+0

Điều đó có vẻ giống như loại tối ưu hóa synth có thể thực hiện cho một trong hai đoạn mã, vì hành vi là giống nhau –

+1

Hãy cẩn thận về đồng hồ hẹn hò. Nó có thể dẫn đến ổn định. – N8TRO

1

Theo như mô phỏng có liên quan, loại bỏ tuyên bố đó không nên thay đổi bất cứ điều gì, vì q nên có loại reg (hoặc logic trong SystemVerilog), và nên giữ giá trị của nó.

Ngoài ra, hầu hết các công cụ tổng hợp nên tạo cùng một mạch trong cả hai trường hợp vì q được cập nhật bằng cách sử dụng một nhiệm vụ không chặn. Có lẽ một mã tốt hơn sẽ được sử dụng always_ff thay vì luôn luôn (nếu công cụ của bạn hỗ trợ nó). Bằng cách này, trình biên dịch sẽ kiểm tra rằng q luôn luôn được cập nhật bằng cách sử dụng một nhiệm vụ không chặn và logic tuần tự được tạo ra.

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