2017-10-10 20 views
1

考慮以下模塊:合成器如何決定bitwdith的中間結果?

module power(input [11-1:0] xi,xq,output [22-1:0] y); 
    assign y = xi*xi + xq*xq; 
    endmodule 

我知道我的一個任務實際上是分解的3個步驟:2米的廣場和一個加法。我的問題是合成器如何決定中間步驟xi*xixq*xq的位寬?

我注意到,運行邏輯equivelance電路(LEC)時,上面的代碼,這會造成麻煩,只能通過分解單分配如下解決三個任務:

module power(input [11-1:0] xi,xq,output [22-1:0] yy); 
    wire [21-1:0] pi,pq; 
    assign pi = xi*xi; 
    assign pq = xq*xq; 
    assign yy = pi+pq; 
    endmodule 
+0

請刪除VHDL標籤。 – JHBonarius

+1

我認爲任何HDL語言都是同樣的問題 – Mortada

+0

馬修泰勒的答案表明這兩個HDL的問題並不完全相同。 – user1155120

回答

2

這裏是如何你的模擬器決定bitwdith的中間結果。

的Verilog仿真

該表達 - assign y = xi*xi + xq*xq; - 是一個上下文確定表達的一個例子。 Verilog仿真器獲取表達式中最廣泛的所有網絡或變量並使用它。因此,在您的代碼中,最寬的是22位寬的y,所以Verilog將始終使用22位。

VHDL仿真

一個VHDL模擬器的行爲取決於所使用的包。如果按照建議使用numeric_std包,那麼您需要遵守以下規則:

總和的寬度應與兩個操作數中較寬的寬度相同。 產品的寬度應該是操作數寬度的總和。

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.numeric_std.all; 

entity power is 
    port (xi, xq : in signed(11-1 downto 0); 
     y  : out signed(22-1 downto 0)); 
end entity power; 

architecture A of power is 
begin 
    y <= xi*xi + xq*xq; 
end architecture A; 

應該不是萬能的簽名:

因此,如果直接翻譯成VHDL代碼會編譯?

鑑於你的模塊(power)的名稱和輸入(xixq)和已經花了25年設計無線電系統,不應該他們是signed?如果不是你的Verilog是:

module power(input signed [11-1:0] xi,xq,output signed [22-1:0] y); 
    assign y = xi*xi + xq*xq; 
endmodule 

這就是爲什麼我從numeric_std,而不是unsigned類型選擇了signed類型。

合成

嗯,我絮叨關於模擬器,但是你問的合成。坦率地說,我不知道合成器會做什麼。但是,考慮到合成器的工作是設計一個邏輯電路,其行爲與仿真完全相同,所以您會認爲任何自我尊重的合成器都會使用與仿真器相同的位寬。所以,我很確定那是你的答案。

+0

我實際上聲明變量爲簽名在我的設計,這就是爲什麼我不需要額外的位: – Mortada

+0

@Mortada是的,因爲你'重新調整它,答案總是會是積極的。我會編輯我的答案。 –

+0

實際上,ceil(log2((2 ^(11-1)-1)^ 2 +(2 ^(11-1)-1)^ 2))爲21,加上一位符號使其爲22位。也就是說,答案是肯定的還是不正確的:我有一個標誌 – Mortada