2013-12-20 54 views
0

在下面的代碼中:首先,我在給定地址加載數據和權重的ROM。在同一時鐘,我正在做數據和重量的乘法。最後,我將位數從16位擴展到23位。代碼編譯沒有錯誤,但有警告。我無法解決這些警告。在xilinx中運行代碼時的警告

module main_module(extended_out,mux_out,data,weight,clk,en,addr); 
input clk,en; 
input [2:0] addr; 
output [7:0] data,weight; 
output [15:0] mux_out; 
output [22:0] extended_out; 

ram_input a1 (clk, en, addr, data); 
ram_weight a2 (clk, en, addr, weight); 
top_module a3 (mux_out,data,weight); 
SignExtender a4 (clk,mux_out,extended_out); 

endmodule 

################### MODULE 1 ##################### ###################

module ram_input (clk, en, addr, data); 
input clk; 
input en; 
input [2:0] addr; 
output reg [7:0] data; 

reg [2:0] raddr; 
always @(posedge clk) 
begin 
    if (en) 
     raddr <= addr; 
end 

always @(raddr,en) 
begin 
    if (en) 
    begin 
     case(raddr) 
     3'b000: data = 8'b0000_0010; 
     3'b001: data = 8'b0000_0110; 
     3'b010: data = 8'b0000_1110; 
     3'b011: data = 8'b0000_0010; 
     3'b100: data = 8'b0000_0100; 
     3'b101: data = 8'b0000_1010; 
     3'b110: data = 8'b0000_1100; 
     3'b111: data = 8'b0000_0000; 
     default: data = 8'b0000_XXXX; 
     endcase 
    end 
    else 
     data = 8'b0000_0000; 
end 

endmodule 

###################### ################# MODULE 2 ########################

module ram_weight (clk, en, addr, weight); 
input clk; 
input en; 
input [2:0] addr; 
output reg [7:0] weight; 

reg [2:0] raddr; 
always @(posedge clk) 
begin 
    if (en) 
     raddr <= addr; 
end 

always @(raddr,en) 
begin 
    if (en) 
    begin 
     case(raddr) 
      3'b000: weight = 8'b0000_1000; 
      3'b001: weight = 8'b0000_1010; 
      3'b010: weight = 8'b0001_1101; 
      3'b011: weight = 8'b0001_0100; 
      3'b100: weight = 8'b0000_0111; 
      3'b101: weight = 8'b0001_0010; 
      3'b110: weight = 8'b0010_1000; 
      3'b111: weight = 8'b0011_1111; 
      default: weight = 8'b0000_XXXX; 
     endcase 
    end 
    else 
     weight = 8'b0000_0000; 
end 

endmodule 

############################ 33 MODULE - 3 ############ #########

module top_module(p,x,y); 
output [15:0]p; 
input [7:0]x,y; 
reg [15:0]p; 

reg [15:0]a; 
integer i; 

always @(x , y) 
begin 
    a=x; 
    p=0; 
    for(i=0;i<8;i=i+1) 
    begin 
     if(y[i]) 
      p=p+a; 
     a=a<<1; 
    end 
end 

endmodule 

##############################模塊 - --- 4 #############################

module SignExtender(clk, extend, extended); 
input[15:0] extend; 
input clk; 
output[22:0] extended; 
reg[22:0] extended; 
wire [15:0] extend; 

always @(posedge clk) 
begin 
    extended[22:0] <= { {7{extend[15]}}, extend[15:0] }; 
end 

endmodule 

######## #######################錯誤##############################

警告646 - 信號「a」已分配但從未使用過。這個未連接的信號將在優化過程中進行修整。

警告1710 - 在main_module塊中,「FF/Latch a4/extended_15」(沒有初始值)的值爲0。這個FF/Latch將在優化過程中被修剪。

警告:Xst:1895 - 由於其他「」FF/Latch修剪「」,FF/Latch「」a4/extended_14「」(無初始值)在塊「main_module」中具有常數值0。這個FF/Latch將在優化過程中被修剪。警告:Xst:1895 - 由於其他FF/Latch修剪,FF/Latch「」a4/extended_13「」(無初始值)在塊「」main_module「」中具有固定值0。這個FF/Latch將在優化過程中被修剪。

警告:Xst:1895 - 由於其他FF/Latch修剪,FF/Latch「」a4/extended_12「」(無初始值)在塊「」main_module「」中具有固定值0。這個FF/Latch將在優化過程中被修剪。

警告:Xst:1895 - 由於其他FF/Latch修剪,FF/Latch「」a4/extended_11「」(無初始值)在塊「」main_module「」中具有固定值0。這個FF/Latch將在優化過程中被修剪。

警告:Xst:1895-由於其他FF/Latch修剪,FF/Latch「」a4/extended_10「」(無初始值)在塊「」main_module「」中具有固定值0。這個FF/Latch將在優化過程中被修剪。

警告:Xst:1895 - 由於其他FF/Latch修剪,FF/Latch「」a4/extended_0「」(無初始值)在塊「」main_module「」中具有固定值0。這個FF/Latch將在優化過程中被修剪。

警告 - 1說你沒有使用常數「a」變量,但同時做乘法我把作爲一個臨時寄存器,但剩餘的錯誤,我不明白他們真正要告訴...

請幫忙解釋這些警告。

+0

當你模擬這種設計時,一切正常嗎?如果你還沒有運行模擬,那麼你應該現在就做,然後回來告訴我們結果。 – 2013-12-20 17:10:17

+0

我建議使用pastebin或github代替長代碼段。沒有顏色很難看到。 – Khanh

+0

是的先生我已經模擬和輸出也來了,但警告的問題,因爲在fpga板執行此代碼時,我不知道天氣我的出來會不會....... –

回答

2

您的基本問題可能是p=p+atop_module。這沒有道理;嘗試繪製原理圖。這是一個加法器輸出反饋到輸入的組合路徑。擺脫它,只需將enter image description here加在一起,具體取決於y的相關位。這可能足以讓你去。

編輯

你的代碼是不太可能(正確地)綜合的(通過任何理智的合成,反正)。考慮這個:

always @(x , y) 
begin 
    a=x; 
    p=0; 
    for(i=0;i<8;i=i+1) 
    begin 
     if(y[i]) 
      p=p+a; 
     a=a<<1; 
    end 
end 

這是組合代碼。您正在要求合成器展開您的i循環。每當xy發生變化時,您希望合成器評估所有8次循環迭代,移動a,並累計到p。合成器通常在循環展開時非常好,但是這是推動它的。擺脫循環,不管你認爲XST是否理解它;這只是不好的做法,可能會讓XST混淆。在紙上繪製原理圖。你正在做的是移動a:你有一個未修改的a,以及7個實例,其中a被移位1到7位。您需要一個加法器,它將所有8條總線加在一起,但是只有在總線上加上i如果y的相應位被置位。換句話說,加法器的每個輸入都有一個多路複用器;一個輸入保持爲零,另一個輸入爲a。你需要自己編寫代碼。這就是你如何進行硬件設計:將所有東西都分解成基本單元 - 多路複用器,移位器,加法器等等,並將它們連接起來。不要編寫你的合成器必須爲你設計的行爲代碼;這是軟件,而不是硬件。

格雷格可能是正確的,因爲你的實際電路可以根據你的實際輸入條件進行簡化,而且這個電路最終還是不用;確認這不是一個5分鐘的工作,反正也沒有意義。您正在嘗試編寫乘數,並且您的輸入條件會發生變化,您需要正確地獲取代碼。 XST可能或可能無法在任何特定情況下解決它可以簡化邏輯的問題,但您必須先修復輸入代碼。

您還有其他問題。不要將X的變量指定爲無所謂。這是非常糟糕的做法,並會出錯。閱讀Mike Turpin's paper等等。總之,除非你確切知道你在做什麼,否則不要使用X's。始終阻止使用x/y中的非阻塞賦值。可能還有其他問題,這些問題在非常快速的通讀中並不明顯。

+0

「」「」「擺脫它只是加在一起的輸入圖像說明在這裏,取決於相關位的y「」「」「」「」我沒有一點混淆圖像清晰的權重和輸入存儲在ROM是輸入multipier .....和它的輸出將簽署擴展,,,,,,',我得到了組合路徑,但任何解決方案,以刪除此代碼 –

1

警告是由合成器通知您生成的網表與您的RTL不匹配但在功能上等同的。對於初學者的FPGA設計師來說,警告可能會被忽略,但他們應該學會如何解決警告。 IC設計師幾乎總是解決警告,因爲它可以使其他問題變得更加困難。您的合成器工具中的優化器正在識別位extended[0]extended[15:10]的變化百分比爲零,其值不是0。它也決定a是沒有必要的。

extended[0]只能是0,因爲data[0]只分配給一個偶數。任何整數乘以偶數總是偶數,因此LSB將始終爲零。用於計算該位的邏輯和觸發器/鎖存器可以安全地用0驅動程序替代。

extended[15:10]位發生類似的優化。 extended的最大值可以是16'b0000_0001_1110_0000; 8'b0000_1100(數據)時間8'b0010_1000(重量)時鐘addr==3'b110。在dataweight的可用值內,除了0以外,不可能有任何大於9的位組合。與第0位一樣,合成器決定節省空間並提高性能,而不是逐字地跟蹤您的代碼。在合成日誌中最有可能出現的警告是extended[22:16]位在優化過程中也會被修剪。

a的警告不是因爲它是一個臨時變量。優化器可識別extended只能是八個可能值之一。 dataweight值的值是從使用相同索引指針的查找表中導出的(addr)。再一次,將8個值硬編碼到另一個查找表中,然後用實際的乘法邏輯,需要更少的邏輯和更好的性能。隨着乘數邏輯不再需要,a變得無用並被刪除。

嘗試refactoring您的RTL。還要確保模塊和網絡的名稱有意義; ex top_modulemultiplier_8bitram_*rom_*。整合冗餘邏輯和更簡潔的功能邏輯。如果你只是想大部分工作,你可以忽略警告。如果你想成爲一名優秀的邏輯設計師,那麼你應該嘗試解決警告。

+0

這條路徑,但在生成網表時顯示錯誤代碼不是可合成 –

+0

您提供的示例僅顯示警告。它在此合成出錯誤http://www.edaplayground.com/s/6/683請確保在嘗試合成之前模擬正確。 – Greg

相關問題