我想了解System Verilog中的任務如何工作。我認爲一個任務只是一種命名和參數化一些代碼的方式,否則它可能會出現在begin
和end
之間。但是,參數的工作方式並不明顯。非阻塞賦值參考參數
說我想從一個模塊中分解出非阻塞賦值的實例。我可能會做類似以下的事情,從而達到了只有參數(ff_0和ff_1)有兩個相同任務的實例不同的地方。
module test_inlined;
bit clk;
int count = 0;
logic [7:0] x, y, z;
task automatic ff_0;
@(posedge clk);
y <= x;
endtask
task automatic ff_1; // really same task as ff_0 to within variable renaming
@(posedge clk);
z <= y;
endtask
always
ff_0;
always
ff_1;
always @(posedge clk)
$strobe("%d: x=%d, y=%d, z=%d", count, x, y, z);
always
#5 clk = !clk;
always @(posedge clk)
begin
x <= count;
count ++;
if (count > 20) $finish;
end
endmodule
這將是微不足道的,而不是放置分解出來的任務(又名觸發器)到同一模塊的兩個實例,因此它將使意義它是也可以表達方面相同的功能兩個相同任務的實例。
以下不起作用,因爲out
被認爲是自動的,或者這就是Modelsim所聲稱的。我不明白爲什麼會這樣,因爲它顯然是對模塊靜態成員的引用。
task automatic ff (ref logic [7:0] out, ref logic [7:0] inp, ref bit clk);
@(posedge clk);
out <= inp;
endtask
module test_broken;
bit clk;
int count = 0;
logic [7:0] x, y, z;
always
ff(y, x, clk);
always
ff(z, y, clk);
// .... same as before
endmodule
確實有意義的是,任務需要自動使用參考參數,因爲那樣就沒有必要擔心它們的壽命。不太清楚爲什麼只允許阻止賦值給自動變量。當存在未決的非阻塞賦值時,它不像是有任何明顯的需要讓自動變量消失嗎?
如何將非阻塞任務分解爲任務?提前謝謝了。
在你的情況下使用任務的目的是什麼?分解非阻塞賦值是一種使rtl不可讀的方法,而使用任務是使它不可綜合的方法。你是用這種方式建立一個測試臺嗎? – Serge
這只是一個讓問題儘可能簡單的方法。我真正想做的是構建一個能夠理解測試向量的抽象表示的測試平臺。如果我不得不使用流行語,那就是TLP。測試平臺的任何一方都不需要模塊,特別是它們都需要通過引用來引用參數並且不可合成。 – jeremiah