Chisel实验笔记(三)

在《Chisel实验笔记(一)》中我们得到了verilog文件,在《Chisel实验笔记(二)》中我们使用Icarus Verilog、GtkWave对的道德verilog文件进行了仿真测试,实际上,时欧诺个Chisel可以得到对应的C++文件,从而可以直接进行仿真,本文就介绍产生C++文件,进行测试的实验过程。

1、修改Max2.scala文件如下:

import Chisel._

class Max2 extends Module {
  val io = new Bundle {
    val in0 = UInt(INPUT,  8)
    val in1 = UInt(INPUT,  8)
    val out = UInt(OUTPUT, 8)
  }
  io.out := Mux(io.in0 > io.in1, io.in0, io.in1)

}

class Max2Tests(c: Max2) extends Tester(c) {
  for (i <- 0 until 10) {
    // FILL THIS IN HERE
    val in0 = rnd.nextInt(1 << 8)
    val in1 = rnd.nextInt(1 << 8)
    poke(c.io.in0, in0)
    poke(c.io.in1, in1)
    // FILL THIS IN HERE
    step(1)
    expect(c.io.out, if(in0 > in1) in0 else in1)
  }
}

object max2 {
  def main(args: Array[String]) : Unit={
      val margs=Array("--backend","c","--genHarness","--compile","--test")
      chiselMainTest(margs, () => Module(new Max2())){c => new Max2Tests(c)}
  }
}

相比《Chisel实验笔记(一)》中的Max2.scala代码,其中增加了Max2Tests类,这是专门用来测试的,相当于verilog中的testbench,在这个Max2Test类中,进行了10次循环,每次测试,都随机得到两个8位的数,使用poke将这两个随机数分别赋值给Max2的in0、in1,然后使用expect判断Max2的输出out是否是是in0、in1中较大的那个值。

除了增加Max2Test类,还修改了main中的margs,将其中的“v”改为了“c”,还增加了参数“--genHarness”、“--test”。

然后打开终端,进入chisel_max的目录,输入sbt,再输入run,可以得到如下结果:

> run
[info] Compiling 1 Scala source to /home/riscv/Documents/chisel_max/target/scala-2.10/classes...
[warn] there were 8 feature warning(s); re-run with -feature for details
[warn] one warning found
[info] Running max2
CPP elaborate
[info] [0.025] // COMPILING < (class Max2)>(0)
[info] [0.028] giving names
[info] [0.034] executing custom transforms
[info] [0.034] adding clocks and resets
[info] [0.038] inferring widths
[info] [0.042] checking widths
[info] [0.043] lowering complex nodes to primitives
[info] [0.043] removing type nodes
[info] [0.043] compiling 5 nodes
[info] [0.044] computing memory ports
[info] [0.044] resolving nodes to the components
[info] [0.049] creating clock domains
[info] [0.050] pruning unconnected IOs
[info] [0.051] checking for combinational loops
[info] [0.052] NO COMBINATIONAL LOOP FOUND
[info] [0.058] populating clock domains
CppBackend::elaborate: need 0, redundant 0 shadow registers
[info] [0.067] generating cpp files
CppBackend: createCppFile Max2.cpp
[info] [1.729] g++ -c -o ./Max2-emulator.o  -I../ -Inull/csrc/  ./Max2-emulator.cpp RET 0
[info] [2.155] g++ -c -o ./Max2.o  -I../ -Inull/csrc/  ./Max2.cpp RET 0
[info] [2.302] g++  -o ./Max2 ./Max2.o ./Max2-emulator.o RET 0
SEED 1432871199400
STARTING ./Max2
RESET 5
  POKE Max2.io_in0 <-  0x6b
  POKE Max2.io_in1 <-  0x99
STEP 1 -> 1
  PEEK Max2.io_out -> 0x99
EXPECT Max2.io_out <- 153 == 153 PASS
  POKE Max2.io_in0 <-  0xc
  POKE Max2.io_in1 <-  0xa7
STEP 1 -> 2
  PEEK Max2.io_out -> 0xa7
EXPECT Max2.io_out <- 167 == 167 PASS
  POKE Max2.io_in0 <-  0x51
  POKE Max2.io_in1 <-  0x80
STEP 1 -> 3
  PEEK Max2.io_out -> 0x80
EXPECT Max2.io_out <- 128 == 128 PASS
  POKE Max2.io_in0 <-  0xc7
  POKE Max2.io_in1 <-  0x8f
STEP 1 -> 4
  PEEK Max2.io_out -> 0xc7
EXPECT Max2.io_out <- 199 == 199 PASS
  POKE Max2.io_in0 <-  0x21
  POKE Max2.io_in1 <-  0x60
STEP 1 -> 5
  PEEK Max2.io_out -> 0x60
EXPECT Max2.io_out <- 96 == 96 PASS
  POKE Max2.io_in0 <-  0xd6
  POKE Max2.io_in1 <-  0xaf
STEP 1 -> 6
  PEEK Max2.io_out -> 0xd6
EXPECT Max2.io_out <- 214 == 214 PASS
  POKE Max2.io_in0 <-  0x96
  POKE Max2.io_in1 <-  0x98
STEP 1 -> 7
  PEEK Max2.io_out -> 0x98
EXPECT Max2.io_out <- 152 == 152 PASS
  POKE Max2.io_in0 <-  0xa4
  POKE Max2.io_in1 <-  0x6b
STEP 1 -> 8
  PEEK Max2.io_out -> 0xa4
EXPECT Max2.io_out <- 164 == 164 PASS
  POKE Max2.io_in0 <-  0xe6
  POKE Max2.io_in1 <-  0x6c
STEP 1 -> 9
  PEEK Max2.io_out -> 0xe6
EXPECT Max2.io_out <- 230 == 230 PASS
  POKE Max2.io_in0 <-  0x7b
  POKE Max2.io_in1 <-  0x3c
STEP 1 -> 10
  PEEK Max2.io_out -> 0x7b
EXPECT Max2.io_out <- 123 == 123 PASS
RAN 10 CYCLES PASSED
PASSED
[success] Total time: 3 s, completed May 29, 2015 11:46:41 AM

在终端中输出了10次模拟结果,PASS表示通过测试。

时间: 2024-08-03 16:34:31

Chisel实验笔记(三)的相关文章

Chisel实验笔记(四)

在<Chisel实验笔记(二)>中,通过编写TestBench文件,然后使用Icarus Verilog.GtkWave可以测试,查看相关波形,比较直观,在<Chisel实验笔记(三)>直接对得到C++模拟器进行测试,也可以得到测试结果,实际上对C++模拟器进行测试也可以同时得到vcd文件,从而使用GtkWave查看波形,得到直观的结果.本文就介绍了这个过程. 为了得到对应的vcd文件,需要对<Chisel实验笔记(三)>中的代码做一处修改: 在main方法的margs

Chisel实验笔记(二)

在上一篇<Chisel实验笔记(一)>中,我们的到了对应的verilog文件,本文将采用Icarus Verilog + GtkWave进行仿真验证. 实验平台还是Ubuntu14.04(64位) 1.安装Icarus Verilog-0.9.7 首先输入如下命令: sudo apt-get install gperf sudo apt-get install flex sudo apt-get install bison sudo apt-get install build-essentia

Chisel实验笔记(一)

最近在学习Risc-v,其中伯克利大学开源了一款兼容Risc-v指令集的处理器Rocket,而Rocket处理器是采用Chisel编写的,所以要学习Chisel,Chisel的简单介绍如下: Chisel (Constructing Hardware In a Scala Embedded Language). Chisel is a hardware construction language embedded in the high-level programming language Sc

深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通过PCA降维,我们能够有效的降低数据的维度,加快运算速度.而白化就是为了使得每个特征能有同样的方差,降低相邻像素的相关性. 主成分分析PCA PCA算法可以将输入向量转换为一个维数低很多的近似向量.我们在这里首先用2D的数据进行试验,其数据集可以在UFLDL网站的相应页面http://ufldl.stanford.edu/wiki/index.php/Exercise:PCA_in_2D

centos救援模式实验笔记

1.  首先在BIOS中把启动选项设置成DVD光驱启动或者USB启动也是可以的 2.  从光盘启动之后再出现的选项中选择"Rescue installed system"然后按回车确认,具体图下图: 3.语言选择,这里我们选择默认的就可以了,因为不是图形化得,所以没有办法支持中文,键盘也选择默认然后按回车,具体如下图: 4.  在SetupNetworking这里我们根据自己的需要来确认是否启用网络,这里我选择的是不启用,如图: 5.  Continue是让虚拟系统(也就是Rescue

SQL*Loader实验笔记【二】

所有SQL*Loader实验笔记 实验案例总结(1-7):     SQL*Loader实验笔记[一] 实验案例总结(8-13):   SQL*Loader实验笔记[二] 实验案例总结(14-19): SQL*Loader实验笔记[三]   8)加载序列 初始化 [email protected]>create table t2 (seqno int,name varchar2(20)); Table created. 控制文件 load data infile * into table t2

CCNA 学习笔记(三)--路由选择协议(静态路由协议)

CCNA 学习笔记(三)--路由选择协议(静态路由协议) 上一章,我们对CISCO的设备有了一定的了解,那现在我们开始去学习下路由选择协议. 静态路由: 1.什么时候是路由? 答:A.路由就是数据包从一端传输到另一端所选择的一条路径.B.数据包的转发. 2.路由器的工作内容? 答:A.路由器首先要知道要到达的目标地址. B.能发现到达目标地址所有可能经过的路由或者节点. C.选择最佳路径. D.维护路由表. 3.查看路由表的命令:show ip route 由上面我们可以看到当前的路由器只是有一

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle&lt;T&gt;

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

构建之法阅读笔记三—结对编程

构建之法阅读笔记三——结对编程 何谓结对编程,结对编程就是程序员肩并肩,平等的,互补的进行开发工作,他们使用同一台电脑,编写同样的程序,一起分析,一起设计,一块交流想法. 然而我以前却并不是这样做的,我以前喜欢在没人打扰的环境下写代码,我觉得有人在我身边看着,会影响我的思路,还有我个人自尊心比较强,不太喜欢被人指指点点,所以每次都是,我写完代码之后,自己先找自己的bug,每当自己实在找不到之后,才会请教大神,但是有时候可能由于自己的能力不足,往往一个很简单的问题,我自己发现就会花费很久的时间,让