2015-01-08 44 views
0

我在嘗試構建一個任務,該任務必須深入研究一些層次結構,可以簡明比較特定實例上的不同引腳。特別是,我想這樣做如下:常量表達式的非法操作數

task check_expected; 
    input integer pin; 
    input [9:0] expected; 
    integer i, j; 
    reg [9:0] check; 
    begin 
    j = 0; 

    for (i = 0; i < 20; i = i + 1) begin 
     case (pin) 
     0: begin 
      check[0] = test.inst[i].lane_0.PIN_FIRST; 
      check[1] = test.inst[i].lane_1.PIN_FIRST; 
      ... 
      check[9] = test.inst[i].lane_9.PIN_FIRST; 
     end 
     1: begin 
      check[0] = test.inst[i].lane_0.PIN_SECOND; 
      check[1] = test.inst[i].lane_1.PIN_SECOND; 
      ... 
      check[9] = test.inst[i].lane_9.PIN_SECOND; 
     end 
     ... 
     9: begin 
      check[0] = test.inst[i].lane_0.PIN_TENTH; 
      check[1] = test.inst[i].lane_1.PIN_TENTH; 
      ... 
      check[9] = test.inst[i].lane_9.PIN_TENTH; 
     end 
     endcase 

     if (check[0] !== expected[j*10 + 0]) begin 
     TEST_FAILED = TEST_FAILED + 1; 
     $display("ERROR Expected=%b, @ %0t",expected[j*10 + 0],$time); 
     end 
     if (check[1] !== expected[j*10 + 1]) begin 
     TEST_FAILED = TEST_FAILED + 1; 
     $display("ERROR Expected=%b, @ %0t",expected[j*10 + 1],$time); 
     end 
     ... 
     if (check[9] !== expected[j*10 + 9]) begin 
     TEST_FAILED = TEST_FAILED + 1; 
     $display("ERROR Expected=%b, @ %0t",expected[j*10 + 9],$time); 
     end 
    end 
    end 
endtask 

不幸的是,試圖做上述拋出擬定過程中NOTPAR錯誤,聲稱這是不可接受的寄存器分配給非恆定(它不喜歡像check[0] = test.inst[i].lane_0.PIN_FIRST;這樣的任何行)。順便說一句,這只是爲了測試目的,而不是任何可綜合的東西。

有人可以解釋爲什麼這是不允許的,並建議一個不同的解決方案?看起來我需要爲每個循環迭代編寫一個任務,而且這看起來像是不必要地臃腫和醜陋。

感謝

回答

0

要回答我的問題,得到的答案是,有沒有辦法使用Verilog做到這一點。 Verilog是一種令人難以置信的(就能力而言)語言,並且對於任務來說,它只能支持模塊實例的不變索引。沒有循環是可能的。

+0

我認爲你對Verilog過於苛刻!你的模擬器的版本是什麼? Verilog 2001支持生成循環。你有沒有嘗試使用這種循環編寫代碼? http://www.sutherland-hdl.com/online_verilog_ref_guide/verilog_2001_ref_guide.pdf – Ari

+1

我已啓用2001年。問題不是生成循環(我已經得到了實際設計)。我上面想要的只是對旁路邏輯的測試,因此我需要深入研究(預先存在的)層次結構。在這個測試上下文中生成語句無效,我只需要一種方法來循環現有的多個模塊實例上的值。不幸的是,Verilog不允許這種類型的循環;所有的索引都必須明確指定,所以任何循環都必須手工展開。 – user3570982