2017-06-21 35 views
5

我有一個模塊,通過parameter然後實例化與定義的參數相對應的另一個模塊。什麼是LINT /綜合安全語句在編譯時拋出一個錯誤?

然而,在這種情況下沒有爲參數的某種組合中定義的事件,我想的誤差在編譯時被拋出突出問題,像這樣:

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin 

    // instantiate module logic_A 

end else if (PARAM1 == 2 && PARAM2 == 1) begin    

    // instantiate module logic_B 

end else begin 

    // throw an error at compile time if we haven't 
    // defined a case for those parameters 

end 
endgenerate 

然而,儘管存在插入錯誤,但這些代碼仍然需要可綜合(在Verilog中,不是SystemVerilog)並傳遞LINTing。

有沒有人知道我可以在這種情況下使用?先謝謝你。

回答

4

我在姊妹網站Electronics StackExchange上爲「a way of conditionally triggering a compile-time error in verilog」回答了非常類似的問題。解決的辦法是有條件的實例化一個不存在的模塊。我建議不存在的模塊有一個很長的名字和有意義的名字來解釋錯誤。這也降低了不存在的模塊意外地與現有模塊具有相同名稱的風險。

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin : use_logicA 
    // instantiate module logic_A 
end 
else if (PARAM1 == 2 && PARAM2 == 1) begin : use_logicB 
    // instantiate module logic_B 
end 
else begin : illegal 
    illegal_parameter_condition_triggered_will_instantiate_an non_existing_module(); 
end 
endgenerate 

這是有效的,因爲檢查非存在模塊是否存在,直到在精化階段評估參數值之後。


更好的解決方案是使用SystemVerilog方法;特別是用符合IEEE Std 1800-2009標準或更新的模擬器。然後,您可以使用$error()並提供更有意義的消息以處理錯誤(例如,打印觸發錯誤條件的參數值)。您可以在IEEE Std 1800-2012 20中閱讀更多內容。11個精系統任務

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin : use_logicA 
    // instantiate module logic_A 
end 
else if (PARAM1 == 2 && PARAM2 == 1) begin : use_logicB 
    // instantiate module logic_B 
end 
else begin : illegal 
    $error("Expected PRAM1/2 to be 1/2 or 2/1, but was %0d/%0d", PARAM1, PARAM2); 
end 
endgenerate 
0

沒有。 Verilog沒有這個功能。編譯時無法完成。

但是你可以做一些轉儲錯誤並在模擬時間'0'退出。

在系統的Verilog你可以添加一個斷言:

initial assert(0) else $fatal("--error--"); 

或只是

initial $fatal("--error--"); 

否則這樣的事情:

initial begin $display("--error--"); $finish; end 

雙方將在開始時提供的消息模擬。

+2

在SystemVerilog中,你可以在'產生-if'的其他條款中做'$致命( 「信息」)。 –

+0

剛剛檢查過,在vcs 2015中已經實現,但需要一個特殊的編譯開關「-assert svaext」。在這種情況下,vcs會生成很好的編譯時消息。否則它會檢測到語法錯誤。使用'初始'它編譯沒有問題,併產生運行時違規消息。 – Serge

1

這是一個有點麻煩,我不知道你的皮棉工具檢查,但是這個怎麼樣:

generate 
    if (PARAM1 == 1 && PARAM2 == 2) begin 

    // instantiate module logic_A 

    end else if (PARAM1 == 2 && PARAM2 == 1) begin    

    // instantiate module logic_B 

    end else begin 

    reg ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2; 
    reg DUMMYO, DUMMYI; 
    always @(posedge ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2 or negedge ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2) 
     DUMMYO <= DUMMYI; 

    end 
endgenerate 

這樣得出的Quartus以下錯誤,當我設置PARAM1以3:

錯誤(10239):Verilog HDL語言始終在synth_assertion.v構建錯誤(18):事件控制不能測試變量 「ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2」 的正的和負邊緣

相關問題