2016-11-14 42 views
0

如果這句法允許系統的Verilog總是在永遠

always_comb begin 
    case (aaa) 
    3'b000: always #(CLKREF_HALF_PERIOD + 5000ps) xclk=~xclk ;//000 at 80MHZ : 
    3'b001: always #(3750ps + CLKREF_HALF_PERIOD) xclk=~xclk;//001 at 100MHZ 
    3'b010: always #(1250ps + CLKREF_HALF_PERIOD) xclk=~xclk;//010 at 200MHZ 
    3'b011: always #(0.252ns + CLKREF_HALF_PERIOD) xclk=~xclk;//011 at 333MHZ 
    3'b100: always #(0.112ns + CLKREF_HALF_PERIOD) xclk=~xclk;//100 at 367MHZ 

    default always #(CLKREF_HALF_PERIOD/1) xclk=~xclk;//default at 400MHZ 
      endcase 

我收到有關案件中的嵌套總是編譯錯誤我想知道。 我試圖讓時鐘頻率根據aaa的輸入而改變。 但是,問題更多的是關於「如果總是在一個塊內總是合法或不合法」的問題。

+0

請添加並解釋您正在嘗試做什麼。 – suku

回答

2

永久循環解決方案不起作用,因爲頂級always塊無法退出forever循環並轉到case語句的另一個分支。一個更簡單的解決方案是使用always塊來計算時鐘延遲,另一個總是阻塞來創建時鐘。

int clk_delay; 
always_comb 
    case (aaa) 
    3'b000: clk_delay = CLKREF_HALF_PERIOD + 5000ps; //000 at 80MHZ 
    3'b001: clk_delay = 3750ps + CLKREF_HALF_PERIOD; //001 at 100MHZ 
... 
always #clk_delay xclk = ! xclk; 
+0

感謝球員的所有答覆! – TheSprintingEngineer

1

不允許嵌套程序塊。我相信aaaaaa參數在這裏。如果是這樣,您可以使用generate塊。使用不同的時鐘頻率。這將使單個組合塊一次處於活動狀態。樣品代碼可以如下:

generate 
    case (aaaaaa) 
    3'b000: always #(CLKREF_HALF_PERIOD + 5000ps) xclk=~xclk ;//000 at 80MHZ : 
    3'b001: always #(3750ps + CLKREF_HALF_PERIOD) xclk=~xclk;//001 at 100MHZ 
    3'b010: always #(1250ps + CLKREF_HALF_PERIOD) xclk=~xclk;//010 at 200MHZ 
    3'b011: always #(0.252ns + CLKREF_HALF_PERIOD) xclk=~xclk;//011 at 333MHZ 
    3'b100: always #(0.112ns + CLKREF_HALF_PERIOD) xclk=~xclk;//100 at 367MHZ 

    default always #(CLKREF_HALF_PERIOD/1) xclk=~xclk;//default at 400MHZ 

endgenerate 

如果aaa可變/註冊/絲則可以使用forever循環結構,而不是內always塊。 Dave_59的答案中更清楚地顯示了示例使用情況。

有關generate塊的更多信息,請參閱IEEE 1800-2012第27.5節。

+0

aaa在此測試平臺中被解析爲「邏輯」 – TheSprintingEngineer

+0

所以它是一個變量,其值可以在運行時更改(而不是elab時間常數)。所以你應該選擇「永遠」循環的第二個選項。 – sharvil111

+1

順便說一句,你不能使用'always_comb'那個延遲或代碼不代表組合邏輯 –