2016-02-28 123 views
1

我需要Verilog設計幫助。通過重複添加Verilog乘法

想法是每次M位設置爲1/true時通過重複添加進行乘法運算。那麼我需要輸出該值。賦值語句F=P;正在拋出錯誤。

這是我得到

Error (10044): Verilog HDL error at Design2.v(13): expression cannot reference entire array "P" 

這是我的理解,我能寄存器分配到的輸出,如果它們的大小相同的錯誤。如果我錯了,那我該如何實現呢?

module Design2(A, N, M, F); 

input A[7:0]; 
input N[3:0]; 
input M; 
reg P[15:0]; 
output F[15:0]; 

always @(M) begin 
    repeat(N) begin 
    P = P + A; 
    end 
    F=P; 
end 

endmodule 
+1

你可能想的支架安裝到您的所有信號名稱的左側,像'輸入[7:0] A;'' – toolic

+0

REG P [15:0];'是16個單位項的數組。 'reg [15:0] P;'是一個16位寬的值。 – Greg

回答

1

保持邏輯分離,我可以看到你的設計有兩個問題。

  1. 正如評論指出的那樣,你在錯誤的地方使用壓縮數組。

  2. 聲明輸出端口F

對於第一問題,設計需要爲所有的端口和變量16位矢量。在此,設計需要一串8位作爲輸入A其必須被聲明爲input [7:0] A,這是一個堆積陣列。而且,P需要是16位大小的矢量才能進行連續的操作。

這是必須要做的,以便當該語句P=P+A執行時,加法操作與完成所有與其各自的尺寸取變量(大小,如果P = 16和A = 8)。整體增加將在A的MSB端使用16位填充零來完成。

因此,轉換所有的變量堆積陣列如下:

input [7:0] A; 
    input [3:0] N; 
    input M; 
    reg [15:0] P; 
    output reg [15:0] F; 

對於第二問題,設計在程序always分配輸出。

wire元素必須由某種東西持續驅動,並且不能存儲值。此後,他們使用連續賦值語句分配值。

reg可用於在程序塊中創建寄存器。因此,它可以商店一些價值。

input端口連接,它具有通過從父模塊連續賦值來驅動,因此input端口總是wire。儘管來自模塊的output可以通過連續驅動通過wire,或者可以通過驅動程序分配reg。下圖顯示了端口連接規則。

Input/Output Declaration

要在目前的設計做到這一點,輸出端口必須是聲明output reg [15:0] F。這是顯示編譯錯誤的原因。

無論哪種方式,你可以有output [15:0] F沒有reg並連續分配到F如下。這將綜合Fwire

output [15:0] F; 
assign F=P; 

SystemVerilog加入了一個logic數據類型爲wirereg聲明的使用之間刪除混亂。甲logic可以通過連續分配或阻擋/非阻塞分配進行驅動。

// Either continuous assignment 
output logic [15:0] F; 
assign F=P; 

// Or procedural assignment 
output logic [15:0] F; 
// Inside always block 
F=P; 

有關緊縮和非緊縮陣列的更多信息,請參閱SystemVerilog Arrays鏈路。關於端口說明,請參閱Wire and Net PDF格式。請參閱SystemVerilog的IEEE 1800-2012的更多信息,logic數據類型。