2013-10-09 57 views
1

當且僅當在該週期調用接口方法/任務時,是否可以合成在週期上聲明的啓用信號?需要類似以下內容:啓用功能/方法調用

interface RAM (logic clk); 
    logic enable; 
    // ... 

    always_ff @(posedge clk) enable = 0; 

    task Read(input address_t address); 
    enable = 1; 
    // ... 
    endtask 

    //... 

    modport server(input clk, input enable, ...); 
    modport client(input clk, export Read, ...); 
endinterface 

顯然上述是非法的。我唯一的想法是保存以前的狀態,比較當前和以前的賦值是否與always_ff相同或不相同,並在任務調用中取反。這看起來並不實際 - 它是非常具體的,因此不太可能在P期間優化掉。我真正需要的是一個具有語義的邏輯元素,當賦值給它賦值時,否則它會變爲默認值。

+0

你能解釋一下時,任務'Read'被調用?Read是一個阻塞任務,還是它真的是一個函數? –

+0

在控制用戶邏輯中將調用Read。因此,您將在某個地方有一個always_ff塊的模塊。有條件的有兩條路徑,一條是讀取被調用,另一條是不是。我不確定這是否回答你的問題。 – sudoer

+0

當* *讀取被調用嗎?你能保證'enable'被設置爲eit她在想要清除它的「總是」之前還是之後,還是有一場比賽?你能畫一個你想要發生什麼的電路圖嗎? – EML

回答

2

您只能寫入來自單個進程的信號。但是你可以在同一個過程中多次寫同一個變量,最後寫得勝。所以,你可以做

always_ff @(posedge clk) 
    begin 
    enable <= 0; 
    case(opcode) 
    READ_OP: Read(...); 
    WRITE_OP: Write(...); 
    endcase 

請注意,您必須始終使用NBA <=分配給enable裏面的任務(和使用無效的功能,而不是任務,如果讀/寫不消耗時間。

+0

所以你說我應該在調用函數的邏輯中的每個時鐘週期內重新設置邏輯?它可能比替代方案更好,但是將其強制到客戶端代碼中違反了結構化編程的最基本的租戶。但是你可能是對的,這可能是Verilog中唯一的方法。 *嘆* – sudoer