risc-v中文社区

 找回密码
 立即注册
查看: 1106|回复: 1

[原创] 基于chisel/verilog的mini路由器实现之仿真测试

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-10-1 10:51:02 | 显示全部楼层 |阅读模式
import chisel3._
import chisel3.iotesters.{ChiselFlatSpec, OrderedDecoupledHWIOTester}
import com.joe.stu.Router
import org.scalatest.FlatSpec

class RouterUnitTester(numberOfPacketsToSend:Int) extends OrderedDecoupledHWIOTester {
  val device_under_test = Module(new Router) //device_under_test其实是abstract class HWIOTester中的抽象类型变量,此类中实例化它
  val m:Router = device_under_test
  //abstract OrderedDecoupledHWIOTester继承自abstract HWIOTester而HWIOTester又继承自class BasicTester而BasicTester又继承自Module
  //在BasicTester中将val io定义为空,这是因为测试模块不需要有IO,只需要用printf,assert和stop,它还有popCount,stop和finish方法
  //在HWIOTester这个abstract class类中var enable_scala_debug = false
  enable_all_debug = true
  rnd.setSeed(0) //随机数种子初值 rnd也是abstract class HWIOTester中定义的val rnd = Random
  //读路由表事件 inputEvent和outputEvent方法将元组添加到事件列表中
  def readRoutingTable(addr:Int,data:Int):Unit = {
    //在抽象父类OrderedDecoupledHWIOTester中方法inputEvent:
    //def inputEvent(pokes: (Data,BigInt)*):Unit = {
    // input_event_list += pokes //ArrayBuffer[Seq[(Data,BigInt)]]调用 += 方法,表示添加集合
    //}
    inputEvent(m.io.read_routing_table_request.bits.addr -> addr)//读路由表请求接口SLAVE的数据总线(ReadCmd类型)的值的addr即地址addr与方法参数addr构成的元组加入inputEvent输入事件列表
    outputEvent(m.io.read_routing_table_response.bits -> data)//读路由表响应接口MASTER的的数据总线(UInt类型)的值与方法参数data构成的元组添加到outputEvent输出事件列表
  }
  //写路由表事件 inputEvent输入事件列表中添加元组成员
  def writeRoutingTable(addr:Int,data:Int):Unit = {
    inputEvent(m.io.load_routing_table_request.bits.addr -> addr,
      m.io.load_routing_table_request.bits.data -> data) //添加二个成员。装载路由表请求接口SLAVE的数据总线(WriteCmd类型)的addr与方法参数addr组成的元组,以及总线的data与方法参数data组成的元组
  }
  //将地址addr和数据data分别放入读路由表事件和写路由表事件列表中
  def writeRoutingTableWithConfirm(addr:Int,data:Int):Unit = {
    writeRoutingTable(addr,data)
    readRoutingTable(addr,data)
  }
  //路由封包处理事件
  def routePacket(header:Int,body:Int,routed_to:Int):Unit = { //routed_to N输出中的具体哪个输出接口
    inputEvent(m.io.in.bits.header -> header,m.io.in.bits.body -> body) //待测模块的输入接口SLAVE的数据总线(Packet类型)的head与header参数构成的元组以及body与body参数构成的元组添加到inputEvent输入事件列表
    outputEvent(m.io.outs(routed_to).bits.body -> body) //指定输出接口MASTER的数据总线(Packet类型)的body与body参数构成的元组添加到outputEvent输出事件列表
    //logScalaDebug是在abstract class HWIOTester中定义的方法,当enable_all_debug或enable_printf_debug任一个配置为true时可以打印信息
    logScalaDebug(s"rout_packet $header $body should go to out($routed_to)")
  }
  readRoutingTable(0,0) // 确认初始化路由表 ?

  for(i <- 0 until Router.numberOfOutputs) {
    writeRoutingTableWithConfirm(i,(i + 1) % Router.numberOfOutputs) //将所有输出接口对应的i以及(i+1)对输出数量取模 分别放入读路由表事件和写路由表事件中
  }
  for( i <- Router.numberOfOutputs -1 to 0 by -1) { //3,2,1,0 逆序
    readRoutingTable(i,(i+1) % Router.numberOfOutputs)//输出接口逆序号当作addr地址,逆序号+1再对输出数量取模当作数据data放入读路由表事件处理中
  }
  for(i <- 0 until Router.numberOfOutputs) { //0,1,2,3
    routePacket(i,i*3,(i+1)%4)//i:header(对应tbl中存储单元的编号),i*3:body(封包内容),(i+1)%4:输出接口MASTER的序号
  }
  private  val new_routing_table = Array.tabulate(Router.routeTableSize){ //新路由表,大小为routeTableSize,每个元素是一个随机整数,范围是:[0,numberOfOutputs)
    _ => scala.util.Random.nextInt(Router.numberOfOutputs)
  }
  for((destination,index) <- new_routing_table.zipWithIndex) {//zipWidthIndex之后每个元素都是一个元组,(数据就是上面的随机数,序号)
    writeRoutingTable(index,destination)//序号当地址addr,随机数当作数据data进行写路由表事件处理
  }
  //发送一组随机值数据包
  for(i <- 0 until numberOfPacketsToSend) { //number_of_packets_to_send用户设置的数据包数量
    val data = rnd.nextInt(Int.MaxValue - 1) //随机整数值
    //i对路由表大小取模 当作header; 随机整数值data当作body;new_routing_table集合中根据索引取元素值即输出编号当作routed_to;然后进行路由封包处理
    routePacket(i % Router.routeTableSize,data,new_routing_table(i % Router.routeTableSize))
  }
}
class RouterTests extends ChiselFlatSpec {
  val number_of_packets = 20
  assertTesterPasses { //仿真断言
    new RouterUnitTester(number_of_packets)
  }
}
object RouterTests {
  def main(args:Array[String]):Unit = {
    val rt = new RouterTests
    rt.execute() //开始仿真
  }
}
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-10-1 10:52:10 | 显示全部楼层
显示如下:
rout_packet 0 0 should go to out(1)
rout_packet 1 3 should go to out(2)
rout_packet 2 6 should go to out(3)
rout_packet 3 9 should go to out(0)
rout_packet 0 2110588844 should go to out(2)
rout_packet 1 1888030084 should go to out(3)
rout_packet 2 49567875 should go to out(0)
rout_packet 3 2021317241 should go to out(2)
rout_packet 4 377907320 should go to out(2)
rout_packet 5 590459143 should go to out(1)
rout_packet 6 672024888 should go to out(2)
rout_packet 7 276804524 should go to out(0)
rout_packet 8 790221947 should go to out(2)
rout_packet 9 314824652 should go to out(3)
rout_packet 10 1514351260 should go to out(1)
rout_packet 11 49903503 should go to out(1)
rout_packet 12 2977882 should go to out(1)
rout_packet 13 1174114692 should go to out(2)
rout_packet 14 19810223 should go to out(3)
rout_packet 0 2071219745 should go to out(2)
rout_packet 1 1208925245 should go to out(3)
rout_packet 2 224392037 should go to out(0)
rout_packet 3 543062387 should go to out(2)
rout_packet 4 1342491602 should go to out(2)
Processing input events done, referenced controlling ports load_routing_table_request,in,read_routing_table_request
Processing output events done, referenced controlling ports, decoupled : outs(3),outs(1),read_routing_table_response,outs(0),outs(2)
  associated event numbers 1,3,5,7,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
Input controller load_routing_table_request : ports  load_routing_table_request.bits.data,load_routing_table_request.bits.addr
Input controller load_routing_table_request : ports  load_routing_table_request.bits.data,load_routing_table_request.bits.addr
  associated event numbers 13,14,15,16,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51
Input controller in : ports  in.bits.header,in.bits.body
Input controller in : ports  in.bits.header,in.bits.body
  associated event numbers 0,2,4,6,8,9,10,11,12
Input controller read_routing_table_request : ports  read_routing_table_request.bits.addr
Input controller read_routing_table_request : ports  read_routing_table_request.bits.addr
  associated event numbers 0,1,2,3,4,5,6,7,8
Output decoupled controller read_routing_table_response : ports  read_routing_table_response.bits
Input controller read_routing_table_response : ports  read_routing_table_response.bits
  associated event numbers 11,14,22,27,29
Output decoupled controller outs(3) : ports  outs(3).bits.body
Input controller outs(3) : ports  outs(3).bits.body
  associated event numbers 10,13,16,17,19,21,26,28,31,32
Output decoupled controller outs(2) : ports  outs(2).bits.body
Input controller outs(2) : ports  outs(2).bits.body
  associated event numbers 9,18,23,24,25
Output decoupled controller outs(1) : ports  outs(1).bits.body
Input controller outs(1) : ports  outs(1).bits.body
  associated event numbers 12,15,20,30
Output decoupled controller outs(0) : ports  outs(0).bits.body
Input controller outs(0) : ports  outs(0).bits.body
================================================================================
Device under test: io bundle
  #  Dir  D/V   Used   Name                      Parent
--------------------------------------------------------------------------------
  0    -   D           in                        in
  1    -   D.          in.bits                   in
  2    I   D.     y    in.bits.body              in
  3    I   D.     y    in.bits.header            in
  4    O   D.          in.ready                  in
  5    I   D.          in.valid                  in
  6    -   D           load_routing_table_request load_routing_table_request
  7    -   D.          load_routing_table_request.bits load_routing_table_request
  8    I   D.     y    load_routing_table_request.bits.addr load_routing_table_request
  9    I   D.     y    load_routing_table_request.bits.data load_routing_table_request
10    O   D.          load_routing_table_request.ready load_routing_table_request
11    I   D.          load_routing_table_request.valid load_routing_table_request
12    -               outs                     
13    -   D           outs(0)                   outs(0)
14    -   D.          outs(0).bits              outs(0)
15    O   D.     y    outs(0).bits.body         outs(0)
16    O   D.          outs(0).bits.header       outs(0)
17    I   D.          outs(0).ready             outs(0)
18    O   D.          outs(0).valid             outs(0)
19    -   D           outs(1)                   outs(1)
20    -   D.          outs(1).bits              outs(1)
21    O   D.     y    outs(1).bits.body         outs(1)
22    O   D.          outs(1).bits.header       outs(1)
23    I   D.          outs(1).ready             outs(1)
24    O   D.          outs(1).valid             outs(1)
25    -   D           outs(2)                   outs(2)
26    -   D.          outs(2).bits              outs(2)
27    O   D.     y    outs(2).bits.body         outs(2)
28    O   D.          outs(2).bits.header       outs(2)
29    I   D.          outs(2).ready             outs(2)
30    O   D.          outs(2).valid             outs(2)
31    -   D           outs(3)                   outs(3)
32    -   D.          outs(3).bits              outs(3)
33    O   D.     y    outs(3).bits.body         outs(3)
34    O   D.          outs(3).bits.header       outs(3)
35    I   D.          outs(3).ready             outs(3)
36    O   D.          outs(3).valid             outs(3)
37    -   D           read_routing_table_request read_routing_table_request
38    -   D.          read_routing_table_request.bits read_routing_table_request
39    I   D.     y    read_routing_table_request.bits.addr read_routing_table_request
40    O   D.          read_routing_table_request.ready read_routing_table_request
41    I   D.          read_routing_table_request.valid read_routing_table_request
42    -   D           read_routing_table_response read_routing_table_response
43    O   D.     y    read_routing_table_response.bits read_routing_table_response
44    I   D.          read_routing_table_response.ready read_routing_table_response
45    O   D.          read_routing_table_response.valid read_routing_table_response
================================================================================
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-5 11:31 , Processed in 0.017183 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表