2017-03-08 25 views
4

這是一種看起來很醜陋的方式。如何指定在Chisel3中平方兩個無符號數的差值?

class DiffSquared extends Module { 
    val inputWidth = 8 
    val width = 16 
    val io = IO(new Bundle { 
    val X = Input(UInt(inputWidth.W)) 
    val M = Input(UInt(inputWidth.W)) 
    val Out = Output(UInt(width.W)) 
    }) 
    val x = Wire(UInt((inputWidth+1).W)) 
    val m = Wire(UInt((inputWidth+1).W)) 
    x := io.X 
    m := io.M 
    val diff = Wire(SInt((inputWidth+1).W)) 
    diff := x.asSInt - m.asSInt 
    io.Out := (diff*diff).asUInt 
} 

什麼是更好的方式零擴展UINT到9位聖馬丁,做差價,將其平方,並表示結果作爲16位UINT?

回答

1

由於沒有一個位,這裏是一個小小的改進。 我們是否應該爲UInt添加一個零擴展方法以使其更好? 那裏已經有一個嗎?

class DiffSquared extends Module { 
    val inputWidth = 8 
    val width = 16 
    val io = IO(new Bundle{ 
    val X = Input(UInt(inputWidth.W)) 
    val M = Input(UInt(inputWidth.W)) 
    val Out = Output(UInt(width.W)) 
    }) 
    def zX(w:UInt) = Wire(UInt((w.getWidth+1).W),init=w).asSInt 
    val diff = Wire(init=zX(io.X)-zX(io.M)) 
    io.Out := (diff*diff).asUInt 
} 
+0

的一般符號擴展方法可以是有用。隨意提交功能請求! – jkoenig

1

這裏有一個有用的功能:zext該零延伸UINT到UINT的寬度的SINT + 1。因此可以編寫代碼爲:

class DiffSquared extends Module { 
    val inputWidth = 8 
    val width = 16 
    val io = IO(new Bundle { 
    val X = Input(UInt(inputWidth.W)) 
    val M = Input(UInt(inputWidth.W)) 
    val Out = Output(UInt(width.W)) 
    }) 
    val diff = io.X.zext() - io.M.zext() 
    io.Out := (diff*diff).asUInt 
} 
相關問題