2016-10-20 35 views
2

我製作了兩個verilog模塊。第一個數字取9位數字,並返回第一個出現位置1。Verilog模塊實例化和空開始結尾

module findPositionOf_1(
    input [8:0] data, 
    output reg [3:0] position 
); 


    always @(data) 
    begin 
    if(data==9'b0000_00000) 
     position=4'b0000; 
    else if(data[0]==1) 
     position=4'b0000; 
    else if(data[1]==1) 
     position=4'b0001; 
    else if(data[2]==1) 
     position=4'b0010; 
    else if(data[3]==1) 
     position=4'b0011; 
    else if(data[4]==1) 
     position=4'b0100; 
    else if(data[5]==1) 
     position=4'b0101; 
    else if(data[6]==1) 
     position=4'b0110; 
    else if(data[7]==1) 
     position=4'b0111; 
    else if(data[8]==1) 
     position=4'b1000; 
    end  

endmodule 

第二模塊返回1.第二次出現它調用第一模塊首先改變該位爲零,再次找到的1

module findPositionOf_2nd_1(
    input [8:0] r1_data, 
    output [3:0] position1 
); 

reg [3:0] pos,pos2; 
reg [8:0] temp; 

integer i; 
always @(r1_data) 
begin 
    findPositionOf_1 f1(.data(r1_data), .position(pos)); 


    i=pos; 
    temp=r1_data; 
    temp[i]=0; 
    findPositionOf_1 f2(temp,pos2); 
    if(pos2==4'b0000) 
    position1=0; 
    else 
    position1=pos2; 

end 

endmodule 

我正在發生以下編譯期間出現錯誤。請幫忙。

找不到'checkPositionOf_1'。實例化'f1'必須是可見的檢查器 。 發現一個空的正文開始/結束塊。 SystemVerilog中允許使用此 ,但在Verilog中不允許。請 尋找任何流浪分號。

回答

5

順便說一句,你寫代碼看起來好像你還沒有完全掌握verilog(和其他HDL語言)與「正常」,程序,編碼的不同之處。

您似乎認爲[email protected]塊中的所有內容都將從上到下執行,並且這些模塊與函數相似。不是這種情況。您需要考慮設計模塊時期望硬件的外觀。

在這種情況下,您知道您需要兩個findPositionOf_1模塊。你知道你想讓第一個(u_f1)的結果影響第二個(u_f2)的輸入。爲此,實例化這兩個模塊,然後確定它們之間的互連。

我們可以通過左移'1pos1<<pos)創建一個位置爲1的矢量。通過異或位一起,聲明r1_data^1<<pos將刪除不需要的1

module findPositionOf_2nd_1(input [8:0] r1_data, output [3:0] position1); 
wire [3:0] pos,pos2; 
wire [8:0] temp; 

    findPositionOf_1 u_f1(.data(r1_data), .position(pos)); 
    findPositionOf_1 u_f2(.data(temp), .position(pos2)); 

    assign temp = r1_data^(1<<pos); 
    assign position1 = pos2; 

endmodule 
+0

爲什麼不能實例化發生在always塊。我對verilog很陌生。 – panshul

1

您已經實例化的組件始終塊,是一個程序塊,這是語法不正確內。其次,你已經使用你的第一個模塊作爲函數調用,這是不允許的。如上所述,您需要有一個單獨的測試臺,您可以在這裏連接兩個模塊並進行檢查。將第一個發生的位置作爲findPositionOf_2nd_1模塊的輸入。對於你的問題,也許這將有助於

Why can't I instantiate inside the procedural block in Verilog