敏捷硬件开发语言Chisel与数字系统设计 课件 第5章 Verilog HDL与基本测试_第1页
敏捷硬件开发语言Chisel与数字系统设计 课件 第5章 Verilog HDL与基本测试_第2页
敏捷硬件开发语言Chisel与数字系统设计 课件 第5章 Verilog HDL与基本测试_第3页
敏捷硬件开发语言Chisel与数字系统设计 课件 第5章 Verilog HDL与基本测试_第4页
敏捷硬件开发语言Chisel与数字系统设计 课件 第5章 Verilog HDL与基本测试_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5.VerilogHDL与基本测试一、生成VerilogHDL二、增加参数的方法三、编写与运行chisel-iotesters四、编写与运行chiseltest目

录2一、生成VerilogHDL3生成VerilogHDL1.1应用场景小明在对Chisel语言学习一段时间之后,终于写出了自己设计的电路,于是迫不及待地想去仿真验证一下电路的功能。但在找验证工具的时候,却出现了问题…支持Chisel的仿真验证工具去哪儿找呀???4生成VerilogHDL1.execute()函数2.emitVerilog()函数1.2生成方式由Chisel代码生成Verilog代码:关系:

emitVerilog()函数本身是通过调用execute()函数来实现生成Verilog代码的,可以将emitVerilog()理解成execute()的简化参数版。5生成VerilogHDL1.2生成方式第一个参数:字符串数组args第二个参数:initialAnnotationsexecute()函数定义:参数:finaldefexecute(args:Array[String],annotations:AnnotationSeq):AnnotationSeq6生成VerilogHDL实例:全加器Chisel代码:packagechapter05

importchisel3._

//定义全加器的输入输出端口

classFullAdderextendsModule{

valio=IO(newBundle{

vala=Input(UInt(1.W))

valb=Input(UInt(1.W))

valcin=Input(UInt(1.W))

vals=Output(UInt(1.W))

valcout=Output(UInt(1.W))

})

//根据输入a,b,cin得到本位和s

io.s:=io.a^io.b^io.cin

//根据输入a,b,cin得到高位进位输出cout

io.cout:=(io.a&io.b)|((io.a|io.b)&io.cin)

}7packagechapter05

importchisel3.stage.ChiselGeneratorAnnotation

objectFullAdderGenextendsApp{new(chisel3.stage.ChiselStage).execute(Array("--target-dir","./generated/chapter05/FullAdderGen"),Seq(ChiselGeneratorAnnotation(()=>newFullAdder)))}生成VerilogHDL实例:全加器主函数里可以包括多个execute函数,也可以包含其它代码。还有一点要注意的是,建议把设计文件和主函数放在一个包里,比如这里的“packagechapter05”,这样省去了编写路径的麻烦。8生成VerilogHDL实例:全加器运行主函数:

1.使用IDEA软件直接点击代码旁边绿色箭头运行;2.如果使用sbt命令行运行,则需要在build.sbt文件所在的路径下打开终端,然后执行命令:如果设计文件没有错误,即可生成如下三个文件:sbt"test:runMainchapter05.FullAdderGen"9objectFullAdderGenextendsApp{

(newchisel3.stage.ChiselStage).

emitVerilog(newFullAdder,Array("--target-dir","./generated/chapter05/FullAdderGen1"))}生成VerilogHDL第一个参数:传入一个无入参返回RawMoudle类型的函数第二个参数:与execute第一个参数类似,也可以定义一个Array指定路径emitVerilog()函数参数:1.2生成方式10objectFullAdderGenextendsApp{

//将生成的字符串形式的Verilog代码赋值给变量

valverilogString=(newchisel3.stage.ChiselStage).emitVerilog(newFullAdder,Array("--target-dir","./generated/chapter05/FullAdderGen2"))

//终端打印输出Verilog文件

println(verilogString)

}生成VerilogHDL1.2生成方式

运行完主函数之后,同样会生成三个文件,生成的Verilog文件和使用execute函数一样。

注意emitVerilog返回值是String,String内容是生成的Verilog。把String打印到终端直接显示出来:11二、增加参数的方法12增加参数的方法

2.1

给Firrtl传递参数在运行主函数时,可以给刚才的命令后面继续增加可选的参数:增加参数“--help”查看帮助菜单objectFullAdderGenextendsApp{

//添加参数“--help”用于得到帮助菜单

new(chisel3.stage.ChiselStage).execute(Array("--target-dir","./generated/chapter05/FullAdderGen","--help"),Seq(ChiselGeneratorAnnotation(()=>newFullAdder)))

}13objectFullAdderGenextendsApp{

new(chisel3.stage.ChiselStage).execute(args,Seq(ChiselGeneratorAnnotation(()=>newFullAdder)))

}增加参数的方法

因为两种方式同时使用时,会以scala代码中指定的路径为准,命令行指定的路径无效。2.1

给Firrtl传递参数在命令行时传入参数:sbt'test:runMainchapter05.FullAdderGen-td./generated/chapter05/FullAdderGen'NOTE:

如果使用这种传参方式,在scala代码中主函数应该写成下面这样:14增加参数的方法

假设要构建一个n位的加法器,具体位宽不确定,根据需要而定。那么,就可以把端口位宽参数化,实例化时传入想要的参数即可。2.2

给主函数传递参数Chisel的模块可以接收参数:classNBitsAdder(n:Int)extendsModule{

valio=IO(newBundle{

vala=Input(UInt(n.W))

valb=Input(UInt(n.W))

vals=Output(UInt(n.W))

valcout=Output(UInt(1.W))

})}

//根据输入a,b得到n位位宽和s

io.s:=(io.a+&io.b)(n-1,0)

//使用+&实现拓展一位加法,最高位为进位输出

io.cout:=(io.a+&io.b)(n)

}15objectNBitsAdderGenextendsApp{

new(chisel3.stage.ChiselStage).execute(Array("--target-dir","./generated/chapter05/NBitsAdderGen"),

Seq(ChiselGeneratorAnnotation(()=>newNBitsAdder(8))))

}增加参数的方法2.2

给主函数传递参数Scala代码中直接写直接将‘8’传入‘NBitsAdder’得到八位加法器16packagechapter05

importchisel3.stage.ChiselGeneratorAnnotation

objectNBitsAdderGenextendsApp{

new(chisel3.stage.ChiselStage).execute(Array("--target-dir","./generated/chapter05/NBitsAdderGen1"),

Seq(ChiselGeneratorAnnotation(()=>newNBitsAdder(args(0).toInt))))

}增加参数的方法终端运行:sbt‘test:runMainchapter05.NBitsAdderGen8’2.2

给主函数传递参数使用命令行传参17增加参数的方法2.3多参数传递当传递参数的数量很多,类型也不同时,在命令行以字符串传递参数,模块内对字符串进行处理实现指定功能。18加法器:(1)两个输入数据位宽可参数化(2)根据“Unsigned”或“Signed”实现无符号数加法或者有符号数加法实例:增加参数的方法2.3多参数传递19classMutiParaAdder(paraA:Int,paraB:Int,paraC:String)extendsModule{

assert((paraC=="Unsigned")|(paraC=="Signed"))

valio=IO(newBundle{

vala=Input(UInt(paraA.W))

valb=Input(UInt(paraB.W))

vals=Output(UInt((if(paraA>paraB)paraA+1elseparaB+1).W))

})

if(paraC=="Unsigned")

io.s:=io.a+&io.b

else

io.s:=(io.a.asSInt()+&io.b.asSInt()).asUInt()

}Chisel代码:增加参数的方法2.3多参数传递20objectMutiParaAdderGenextendsApp{

new(chisel3.stage.ChiselStage).execute(Array("--target-dir","./generated/chapter05/MutiParaAdderGen"),

Seq(ChiselGeneratorAnnotation(()=>newMutiParaAdder(6,8,"Unsigned"))))

}objectMutiParaAdderGenextendsApp{

new(chisel3.stage.ChiselStage).execute(Array("--target-dir","./generated/chapter05/MutiParaAdderGen2"),

Seq(ChiselGeneratorAnnotation(()=>newMutiParaAdder(args(0).toInt,args(1).toInt,args(2)))))

}终端执行:sbt"test:runMainchapter05.MutiParaAdderGen268Signed"Scala代码中传参命令行传参三、编写与运行chisel-iotesters21编写chisel-iotesters对于超大型的系统级电路,最好还是生成Verilog,交由成熟的EDA工具,用UVM进行验证。3.1

Chisel的测试方式利用Scala的测试来验证Chisel级别的代码逻辑有没有错误。(复杂)利用Chisel库里的peek和poke函数,给模块的端口加激励、查看信号值,并交由下游的Verilator来仿真、产生波形。(适合小型电路的验证)22编写chisel-iotesters

"edu.berkeley.cs"%%"chisel-iotesters"%"1.5.2"3.2具体步骤编写一个chisel-iotesters,需要在.sbt库依赖添加一句:定义一个类这个类继承自PeekPokeTester类测试类内部有四种方法

①“poke(端口,激励值)”方法②“peek(端口)”方法③“expect(端口,期望值)”方法④“step(n)”方法23importscala.util._

importchisel3.iotesters._

classNBitsAdderTest(c:NBitsAdder)extendsPeekPokeTester(c){

valrandNum=newRandom

for(i<-0until10){

vala=randNum.nextInt(256)

valb=randNum.nextInt(256)

poke(c.io.a,a)

poke(c.io.b,b)

step(1)

expect(c.io.s,(a+b)&0xff)

expect(c.io.cout,((a+b)&0x100)>>8)

}

}编写chisel-iotesters实例:8位加法器的testbench第一个包scala.util里包含了Scala生成伪随机数的类Random;第二个包chisel3.iotesters包含了测试类PeekPokeTester;24运行chisel-iotesters

运行这个主函数,执行成功后,就能在相应文件夹里看到一个新生成的文件夹,里面是仿真生成的文件。其中,“NBitsAdder.vcd”文件就是波形文件,使用GTKWave软件打开就能查看。运行测试,需要通过主函数://NbitsAdderTest.scala

objectNBitsAdderTestMainextendsApp{

//指定后端使用verilator仿真

chisel3.iotesters.Driver.execute(Array("--target-dir","./generated/chapter05/NBitsAdderTest","--backend-name","verilator"),

()=>newNBitsAdder(8))(c=>newNBitsAdderTest(c))

}25运行chisel-iotesters

那么终端就会显示如下信息:[info][0.002]SEED1550906002475[info][0.005]POKEio_a<-184[info][0.006]POKEio_b<-142[info][0.006]STEP0->1[info][0.007]EXPECTAT1io_sgot70expected70PASS……[info][0.024]EXPECTAT10io_coutgot0expected0PASStestAdderSuccess:20testspassedin15cyclesin0.047415seconds316.36Hz[info][0.025]RAN10CYCLESPASSED[success]Totaltime:7s,completedFeb23,20193:13:26PM如果只想在终端查看仿真运行的信息,则执行以下主函数:objectNBitsAdderTestMainextendsApp{

chisel3.iotesters.Driver.execute(Array("--target-dir","./generated/chapter05/NBitsAdderTest","--is-verbose"),()=>newNBitsAdder(8))(c=>newNBitsAdderTest(c))

}26四、编写与运行chiseltest27编写chiseltest4.1

chiseltest定义:

是用于基于Chisel的RTL设计的测试工具,目前支持定向测试(手动指定的所有测试激励)。特点:

chiseltest强调轻量级(最小化样板代码)、易于读写(可理解性)和可复用(更好地重用测试代码)的测试。核心功能:1.poke,expect,step2.fork和join类似chisel-iotesters,但语法不同:tester.poke(wire,value)是使用Scala数值,在chiseltest中,wire.poke(value)使用Chisel字面值编写。28编写chiseltest1.该项目旨在取代chisel-testers,最终可能成为chisel3

的默认部分。其支持

chisel-testers

中的所有功能,并提供附加功能。2.用chisel-iotesters编写的测试用例不能直接用在chiseltest中,因为语法明显不同。在Chisel项目的指定路径下创建一个新文件,例如BasicTest.scala。然后在这个文件中:4.2

chiseltest作用4.3实现步骤29编写chiseltest添加必要的导入: importorg.scalatest._ importchiseltest._ importchisel3._创建一个测试类:classBasicTestextendsFlatSpecwithChiselScalatestTesterwithMatchers{behaviorof"MyModule"//testclassbodyhere}在测试类中,定义一个测试用例:itshould"dosomething"in{//testcasebodyhere}30编写chiseltest在测试用例中,定义被测试的模块: test(newMyModule){c=>//testbodyhere}在测试体中,使用poke、step和expect操作来编写测试:

c.in.poke(0.U)c.out.expect(0.U)

c.in.poke(42.U)

c.out.expect(42.U)

测试用例完成后,可以通过调用

ScalaTest来运行项目中的所有测试用例;

如果使用的是sbt,则可以从命令行sbttest或test(sbt控制台)运行;

testOnly也可用于运行特定测试;31classNBitsAdderChiselTestextendsFlatSpecwithChiselScalatestTesterwithMatchers{

behaviorof"NBitsAdder"

itshould"Addtwonumbers"in{

test(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论