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的特性是不用描述出長度,且通過 ...