2016-02-22 403 views
0

我在設計中使用時鐘切換電路。這是細胞的行爲模型。如何在verilog中將寄存器初始化爲隨機值?

module toggle (En, CP, Q); 
    input CP, En ; 
    output Q; 

    reg Q_int; 

`ifdef INIT 
    initial Q_int = 1'b0; 
`endif 

    always @ (posedge CP) begin 
    if (En) Q_int <= ~Q_int; 
    end 

    assign Q = Q_int; 

endmodule 

在我的模擬過程中,我正在使用ifdef將Q_int初始化爲零。如果Q只是改變它的狀態,那麼它不會完全覆蓋真實的行爲,不管它從何處開始(0或1)。那麼如何將Q_int初始化爲ZERO或ONE以用於模擬目的。

如何在verilog或系統verilog中實現這樣的Q_int = random(0或1)?

回答

2

一種方法是使用IEEE Std 1800-2012,第18.13.2節$urandom_range()函數。傳遞1的單個參數將隨機返回0或1.當我將其他種子值傳遞給我的模擬器命令(VCS或Incisive)時,我會得到分配給Q_int的隨機初始值。

module toggle (En, CP, Q); 
    input CP, En ; 
    output Q; 

    reg Q_int; 

    initial Q_int = $urandom_range(1); 

    always @ (posedge CP) begin 
    if (En) Q_int <= ~Q_int; 
    end 

    assign Q = Q_int; 

endmodule 
+0

感謝您的建議。 $ urandom_range(1)vs just $ random有什麼區別?對於這種情況,他們都會有相同的效果? –

+0

不客氣。當你嘗試時會發生什麼?你可以在同一個文檔中閱讀$ random。 – toolic

0

您也可以在萬一你想通過輸入相同的種子值重現相同的輸出,你可以使用

$random(seed_value) % 2... 

的種子值是非常重要的。

0

你的代碼似乎很好,它應該將Q_int初始化爲0,但要確保你在命令行中傳遞了「INIT」。

+0

這是如何回答初始化爲隨機值的主要問題?這應該是一個評論,而不是一個答案。 – toolic

+0

是的,它的工具應該是評論而不是回答,但根據堆棧溢出規則,只有50分的人可以評論任何人的問題或答案。關於問題,據我從問題和代碼的意圖瞭解,這個人在初始化Q_int時遇到了問題,所以我相應地回答了這個問題。 –

+0

這裏的要點是,無論提到的原始代碼是否適合我,它應該可以工作,但由於某種原因,它不起作用,無法初始化變量Q_int。另外,在問題的最後部分,人們問'那麼我怎麼能將Q_int初始化爲零或一個以用於模擬目的。所以這個說法表明這個人在初始化變量時遇到了麻煩。我只是表達了我的想法,他/她可能會錯過。是的,最初我試圖評論它,但無法做到,所以我回答了這個問題。 –

0

您的代碼看起來簡單,

module toggle (En, CP, Q); 
    input CP, En ; 
    output Q; 

    reg Q_int; 

    // initial Q_int = $urandom_range(1,0); 

    // initial Q_int = $random(); 

    always @ (posedge CP) begin 
    if (En) Q_int <= ~Q_int; 
    end 

    assign Q = Q_int; 

endmodule 

兩個註釋語句可以使用。 $ random將根據種子值從系統的RNG生成32位值,因爲您的RHS是1位,它只分配LSB,在$ urandom_range的情況下,它將只生成指定範圍內的隨機數,0到1 ,這也取決於種子價值。