Chisel 學習筆記(五)

2022-08-30 03:36:12 字數 3400 閱讀 6470

chisel

val register = reg(uint(12.w))

class

registermodule

extends

module)

val register = reg(uint(12.

w)) register := io.in + 1.

u io.out := register

}

還可以通過regnext來例項化出來乙個暫存器

class

regnextmodule

extends

module)

// register bitwidth is inferred from io.out

io.out := regnext(io.in + 1.

u)}

step(n)可以改變n次時鐘,常用於測試中

class

registermoduletester(c: registermodule

) extends

peekpoketester(c)

}

可以通過reginit來讓暫存器中初始附帶特定值

val myreg = reginit(uint(12.

w), 0.

u)val myreg = reginit(0.

u(12.

w))

有如下例子

classclass  reginitmodulereginit

extends

module )

val register = reginit(0.

u(12.

w)) register := io.in + 1.

u io.out := register

}

必須要使用reginit,否則暫存器裡的初值未知

可以在測試時使用reset(n)來使reset訊號有效n個週期

chisel中對於暫存器有預設的同步復位reset和時鐘clk,但如果想自己加入額外的復位訊號和額外的時鐘訊號,就要用到withclock/withreset/withclockandreset

withclock(a){}意味著在a的上公升沿會觸發什麼

withreset(a){}意味著在標準時鐘上公升沿a有效時復位

withclockandreset(a,b){}意味著在a的上公升沿,b有效時復位

class

clockexamples

extends

module

) val imp = reginit(0.

u(10.

w)) imp := io.in

io.outimplicit := imp

withreset(io.alternatereset)

withclock(io.alternateclock)

withclockandreset(io.alternateclock, io.alternatereset)

}object

main

}

生成的verilog中相關部分如下

module clockexamples( // @[:@3.2]

input clock, // @[:@4.4]

input reset, // @[:@5.4]

input [9:0] io_in, // @[:@6.4]

input io_alternatereset, // @[:@6.4]

input io_alternateclock, // @[:@6.4]

output [9:0] io_outimplicit, // @[:@6.4]

output [9:0] io_outalternatereset, // @[:@6.4]

output [9:0] io_outalternateclock, // @[:@6.4]

output [9:0] io_outalternateboth // @[:@6.4]

); reg [9:0] imp; // @[passthrough.scala 137:20:@8.4]

reg [31:0] _rand_0;

reg [9:0] _t_23; // @[passthrough.scala 143:25:@11.4]

reg [31:0] _rand_1;

reg [9:0] _t_26; // @[passthrough.scala 149:25:@14.4]

reg [31:0] _rand_2;

reg [9:0] _t_29; // @[passthrough.scala 155:22:@17.4]

reg [31:0] _rand_3;

assign io_outimplicit = imp; // @[passthrough.scala 139:18:@10.4]

assign io_outalternatereset = _t_23; // @[passthrough.scala 145:26:@13.4]

assign io_outalternateclock = _t_26; // @[passthrough.scala 151:26:@16.4]

assign io_outalternateboth = _t_29; // @[passthrough.scala 157:25:@19.4]

always @(posedge clock) begin

if (reset) begin

imp <= 10'h0;

endelse

begin

imp <= io_in;

endif (io_alternatereset) begin

_t_23 <= 10'h0;

endelse

begin

_t_23 <= io_in;

endendalways @(posedge io_alternateclock) begin

if (reset) begin

_t_26 <= 10'h0;

endelse

begin

_t_26 <= io_in;

endif (io_alternatereset) begin

_t_29 <= 10'h0;

endelse

begin

_t_29 <= io_in;

endendendmodule

chisel學習筆記1

chisel是在scala的基礎上建立起來的,初學chisel可能有點摸不著頭腦,建議去菜鳥學學scala先。碼一下scala的筆記,賊適合入門。scala是乙個物件導向的程式語言,了解這一點很重要,這也是scala和chisel的乙個很大的優勢。變數是物件。運用val宣告的常量也是物件。甚至lit...

chisel學習筆記2

第乙個chisel模組 1 直接上 chisel 定義乙個模組 class passthrough extends module io.out io.in 以上 定義了乙個名字叫做passthrough的chiselmodule,它有乙個4位元的輸入,名字叫做in,還有乙個4位元的輸出out。這個模...

Chisel 學習筆記(七)

chisel 在chisel中,我們既可以使用scala中自帶的集合,包括list,seq,arraybuffer list的使用方式在學習筆記 一 中有所體現 seq與list類似,但是在chisel中,我們更常使用seq來表述某個模組的引數 arraybuffer的特性是不用描述出長度,且通過 ...