joe 发表于 2021-8-11 22:29:05

verilog中的inout与chisel3中的Analog

import chisel3._
import chisel3.experimental._
import chisel3.util.HasBlackBoxInline

//chisel3中基本上各种Module的时钟和复位信号都是默认的
// (
//   abstract class MultiIOModule extends RawModule 中 final val clock:Clock= {...}
//   而 abstract class Module extends RawModule 中 final val clock:Clock = IO(Input(Clock()).suggestName("clock")
//   final val reset:Reset = IO(Input(mkReset)).suggestName("reset"))
// )
//但RawModule则是需要用户指定时钟和复位信号(从上面节选出来的代码可以知道RawModule中无clock和reset,RawModule的子类才有),
//如果RawModule不指定时钟和复位信号,则可以用于组合逻辑:
// class MyAndModule extends RawModule {
//val io = IO(new Bundle {
//val a = Input(UInt(8.W))
//val b = Input(UInt(8.W))
//val c = Output(UInt(8.W)) })
//io.c = io.a & io.b
//}
//verilog中多时钟域设计时,比如异步FIFO,可以带有多个时钟信号,很容易理解
//在chisel3中则相对来说要复杂些,因为这与scala中变量作用域有关系,同时,时序元件都是隐式跟随当前时钟域
//在verilog中有inout端口,在chisel3中与inout相对应的是Analog
//Analog的apply带一个Width参数
//一个Module中的IO端口可以为Input,可以为Output,也可以为Analog,
//Analog端口只能用于与BlackBox(是BaseModule的子类)连接,当然,为了加载verlog的模块代码,可以混入
//trait HasBlackBoxInline,可以加入黑盒中的verilog代码,并且还可以取一个名字
class InOutIO extends Bundle {
val a = Analog(32.W)
val b = Input(UInt(32.W))
val sel = Input(Bool())
val c = Output(UInt(32.W))
}
class InOutPort extends BlackBox with HasBlackBoxInline{
val io = IO(new InOutIO)
setInline("InoutPort.v",
    """
      module InoutPort(
       inout a,
       input b,
       input sel,
       output c);
       assign a = sel ? 'bz : b;
       assign c = sel ? a : 'bz;
      endmodule
    """.stripMargin)
}
class MakeInout extends Module {
val io = IO(new InOutIO)
val mInOutPort = Module(new InOutPort)
mInOutPort.io <> io //Data中的final def <> 单向连接 宽度,数量都要一致
}


页: [1]
查看完整版本: verilog中的inout与chisel3中的Analog