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;
這樣的任何行)。順便說一句,這只是爲了測試目的,而不是任何可綜合的東西。
有人可以解釋爲什麼這是不允許的,並建議一個不同的解決方案?看起來我需要爲每個循環迭代編寫一個任務,而且這看起來像是不必要地臃腫和醜陋。
感謝
我認爲你對Verilog過於苛刻!你的模擬器的版本是什麼? Verilog 2001支持生成循環。你有沒有嘗試使用這種循環編寫代碼? http://www.sutherland-hdl.com/online_verilog_ref_guide/verilog_2001_ref_guide.pdf – Ari
我已啓用2001年。問題不是生成循環(我已經得到了實際設計)。我上面想要的只是對旁路邏輯的測試,因此我需要深入研究(預先存在的)層次結構。在這個測試上下文中生成語句無效,我只需要一種方法來循環現有的多個模塊實例上的值。不幸的是,Verilog不允許這種類型的循環;所有的索引都必須明確指定,所以任何循環都必須手工展開。 – user3570982