• Chisel 学习笔记(四)


    Chisel中的组合逻辑

    Input与Output

    Chisel中的所有类都要继承Module
    类中必须要定义io类型,用来表示该模块的输入输出端口
    每一个输入输出端口,需要说明是有符号数还是无符号数,以及数据位宽

    class MyOperatorsTwo extends Module {
      val io = IO(new Bundle {
        val in      = Input(UInt(4.W))
        val out_mux = Output(UInt(4.W))
        val out_cat = Output(UInt(4.W))
      })
    }
    
    class MyOperators(val length : Int) extends Module {
      val io = IO(new Bundle {
        val in      = Input(UInt(length.W))
        val out_mux = Output(UInt(length.W))
        val out_cat = Output(UInt(length.W))
      })
    }
    

    数据类型与赋值

    Chisel中所有的变量只能用val,不能用var
    Chisel中的数据类型有UInt,SInt,Bool,并且Chisel中的数据类型只能和Chisel中的数据类型进行运算,因此运算时如果需要操作常数,需写成2.U的形式

    class MyOperators extends Module {
      val io = IO(new Bundle {
        val in      = Input(UInt(4.W))
        val out_add = Output(UInt(4.W))
        val out_sub = Output(UInt(4.W))
        val out_mul = Output(UInt(4.W))
      })
    
    	val s = true.B
      io.out_add := 1.U + 4.U
      io.out_sub := 2.U - 1.U
      io.out_mul := 4.U * 2.U
    }
    

    在变量初始化时使用等号,在赋值时使用:=,代表左侧变量由右侧表达式驱动
    另外scala中提供比较常见的如多选器,连接器

      val s = true.B
      io.out_mux := Mux(s, 3.U, 0.U) 
      io.out_cat := Cat(2.U, 1.U) 
    

    对于加法运算,Chisel提供了两种加法运算,+&表示会保留进位,+不保留进位

    控制语句

    如果有多条赋值语句驱动相同左侧变量,则选择最后一个,如下

    class LastConnect extends Module {
      val io = IO(new Bundle {
        val in = Input(UInt(4.W))
        val out = Output(UInt(4.W))
      })
      io.out := 1.U
      io.out := 2.U
      io.out := 3.U
      io.out := 4.U		//编译器选择这一条
    }
    

    when, elsewhen, otherwise

    Chisel中提供条件语句when, elsewhen和otherwise
    使用方式和if-else语句一样
    语法如下:

    when(someBooleanCondition) {
      // things to do when true
    }.elsewhen(someOtherBooleanCondition) {
      // things to do on this condition
    }.otherwise {
      // things to do if none of th boolean conditions are true
    }
    

    示例如下:

    class Max3 extends Module {
      val io = IO(new Bundle {
        val in1 = Input(UInt(16.W))
        val in2 = Input(UInt(16.W))
        val in3 = Input(UInt(16.W))
        val out = Output(UInt(16.W))
      })
        
      when(io.in1 > io.in2 && io.in1 > io.in3) {
        io.out := io.in1  
      }.elsewhen(io.in2 > io.in1 && io.in2 > io.in3) {
        io.out := io.in2 
      }.otherwise {
        io.out := io.in3
      }
    }
    

    需要注意的是,Chisel中的条件语句不像scala中的那样,最后一行为返回值

    val result = when(squareIt) { x * x }.otherwise { x }
    

    这样是不行的

  • 相关阅读:
    【转】随机函数的rand、srand用法
    realloc,malloc,calloc函数的区别
    c语言中time相关函数
    C语言strdup函数
    c语言strtod()函数的用法
    (转)从拜占庭将军问题谈谈为什么pow是目前最好的共识机制
    Linux命令行编辑快捷键
    少走弯路的10条忠告
    centos6下升级git版本的操作记录
    (转)Ctrl+H 浪潮Raid配置文档
  • 原文地址:https://www.cnblogs.com/JamesDYX/p/10079689.html
Copyright © 2020-2023  润新知