import chisel3.util._ class Sample extends Module { val io = IO(new Bundle { val in = Input(Bool()) val out = Output(Bool()) }) val reg = RegInit(false.B) reg := io.in io.out := reg }
import chisel3.util._ class Sample extends Module with RequireAsyncReset { val io = IO(new Bundle { val in = Input(Bool()) val out = Output(Bool()) }) val reg = RegInit(false.B) reg := io.in io.out := reg } ASIC な人でも実際安心
数値 100 32’d0 65’h1FFFFFFFFFFFFFFFF true false 100.U(unsigned) / 100.S (signed) 0.U(32.W) / 0.S(32.W) “h1FFFFFFFFFFFFFFFF”.U(65.W) true.B false.B FF logic ff; always_ff @(posedge clk) if (!rst) ff <= 1’b0; else ff <= 1’b1; val ff = RegInit(0.U(1.W)) ff := 1.U(1.W) 三項演算子 c? a : b Mux(c, a, b) if - else if - else if (cond1) begin end else if (cond2) begin end else begin end when(cond1) { }.elsewhen(cond2) { }.otherwise { } 比較演算子 a == b a != b a === b a =/= b
port 宣言 module X ( input [1:0] a, output [2:0] b ); val io = IO( new Bundle { val a = Input(UInt(2.W)) val b = Output(UInt(3.W)) }) 三項演算子連打 logic x; assign x = c1 ? a1: c2 ? a2: c3 ? a3: x_default; val x = WireInit( xDefault ) when(c1) { x := a1 } when(c2) { x := a2 } when(c3) { x := a3 } MuxCaseというのもあるにはある switch 文 case (state) X: endcase when().elsewhen().otherwise が良い MuxLookupやswitch-is があるにはあるが… instance 化 my_module i1 ( .x(x), .y(y) ); val i1 = Module(new MyModule) i1.io.x := x i1.io.y := y
の interface の様なものです 25 interface X; logic [7:0] a; logic b; endinterface class X extends Bundle { val a = UInt(8.W) val b = Bool() } new Bundle { val a = UInt(8.W) val b = Bool() } SystemVerilog Chisel X という名前を付けずにインスタンスを作成する場合
の interface の様なものです 26 interface X; logic [7:0] a; logic b; //※ modport で宣言しなくても使える modport o ( output a, output b ); modport i ( input a, input b ); endinterface class X extends Bundle { val a = UInt(8.W) val b = Bool() } // IO として使う時 val io = IO( new Bundle { val o = Output(new X) val i = Input(new X) }) SystemVerilog Chisel
の interface の様なものです 27 interface X; logic [7:0] a; logic b; modport main ( output a, input b ); modport secondary ( input a, output b ); endinterface class X extends Bundle { val a = Output(UInt(8.W)) val b = Input(Bool()) } // IO として使う時 val io = IO( new Bundle { val main = new X val secondary = Flipped(new X) }) SystemVerilog Chisel