2016-09-15 69 views
1

當使用聖馬丁和uint實現加法器我得到同樣的Verilog代碼,請參見下面的代碼,鑿:Verilog的生成代碼聖馬丁和uint

import Chisel._ 

class Unsigned_Adder extends Module{ 
    val io = new Bundle{ 
    val a =  UInt(INPUT, 16) 
    val b =  UInt(INPUT, 16) 
    val out = UInt(OUTPUT) 
    } 
    io.out := io.a + io.b 
} 

import Chisel._ 

class Signed_Adder extends Module{ 
    val io = new Bundle{ 
    val a =  SInt(INPUT, 16) 
    val b =  SInt(INPUT, 16) 
    val out = SInt(OUTPUT) 
    } 
    io.out := io.a + io.b 
} 

這將生成相同的Verilog代碼,

module Signed_Adder(
    input [15:0] io_a, 
    input [15:0] io_b, 
    output[15:0] io_out 
); 

    wire[15:0] T0; 


    assign io_out = T0; 
    assign T0 = io_a + io_b; 
endmodule 

當然模塊名稱會有所不同。用乘法運算符(*)

io.out := io.a * io.b 

在鑿實現事半功倍的時候我會爲UINT和聖馬丁,凡在聖馬丁的代碼會看起來像一個不同的Verilog代碼,

module Multi(
    input [15:0] io_a, 
    input [15:0] io_b, 
    output[31:0] io_out 
); 

    wire[31:0] T0; 


    assign io_out = T0; 
    assign T0 = $signed(io_a) * $signed(io_b); 
endmodule 

$signed添加到代碼中。這是爲什麼?爲什麼在附加案例中我得到了相同的Verilog代碼,但在乘法情況下,我爲UInt和SInt生成了不同的代碼?

回答

2

如果變量的大小相等,加法器不關心符號,由於溢出位,加法是正確的。 但隨着乘法,我們必須知道符號來管理它。

看到有關的Verilog簽署的算術此文檔的詳細信息:如果你使用+ &那麼Addr.io.out的寬度爲17位

,並用Verilog這個地址贏得 enter link description here

0

如FabienM所說,它不關心符號,因爲它將由高層次設計處理,如無符號簽名變換,然後連接到此地址,並將轉換爲2補碼形式。