【IC设计】Chisel API之Arbiter和RRArbiter的使用

文章目录

    • 介绍
    • Chisel的Valid和Ready流控
    • build.sbt
    • RRArbiter代码示例

介绍

仲裁器在NoC路由器中是重要的组成部分,虚通道仲裁和交叉开关仲裁都需要使用仲裁器。
Chisel提供了Arbiter和RRArbiter仲裁器
Arbiter是基础的低位优先仲裁器,
RRArbiter初始情况下也是低位优先仲裁,但在某个通道仲裁胜出后,该通道的优先级将置为最低。
举例:
假设有3个通道,0 1 2,初始情况下0优先级最高,1其次,2最低,假设1和2同时请求资源,那么根据低位优先的原则,
通道1获胜,然后优先级从高到低位0 2 1,然后0和2同时请求资源,那么通道0获胜,优先级变为2 1 0

Chisel的Valid和Ready流控

Ready-Valid接口是一种简单的控制流接口,包含:

  1. data:发送端向接收端发送的数据;
  2. valid:发送端到接收端的信号,用于指示发送端是否准备好发送数据;
  3. ready:接收端到发送端的信号,用于指示接收端是否准备好接收数据;
    在这里插入图片描述
    发送端在data准备好之后就会设置valid信号,接收端在准备好接收一个字的数据的时候就会设置ready信号。数据的传输会在两个信号,valid信号和ready信号,都被设置时才会进行。如果两个信号有任何一个没被设置,那就不会进行数据传输。
    更详细的内容参考该博客

在对RRArbiter进行测试过程中,由于仲裁器是接收数据的设备,因此valid和data是输入信号,ready是接收信号,需要对valid和data信号设置激励,并查看输出端获胜的数据。

build.sbt

程序的build.sbt配置如下:

ThisBuild / scalaVersion     := "2.13.8"
ThisBuild / version          := "0.1.0"
ThisBuild / organization     := "BATHTUB"val chiselVersion = "3.6.0"lazy val root = (project in file(".")).settings(name := "noc-router-main",libraryDependencies ++= Seq("edu.berkeley.cs" %% "chisel3" % chiselVersion,"edu.berkeley.cs" %% "chiseltest" % "0.6.0" % "test",//包含ChiselTest会自动包含对应版本的ScalaTest//导入scalatest的库//"org.scalatest" %% "scalatest" % "3.1.4" % "test"),scalacOptions ++= Seq("-language:reflectiveCalls","-deprecation","-feature","-Xcheckinit","-P:chiselplugin:genBundleElements",),addCompilerPlugin("edu.berkeley.cs" % "chisel3-plugin" % chiselVersion cross CrossVersion.full),)

RRArbiter代码示例

以下代码可以直接运行,并给出了详细注释。
输出结果:
在这里插入图片描述

//3个输入的RRArbiter官方API测试
//依次测试001~111请求下的输出数据
//初始情况下默认低位优先,在每次仲裁后,将仲裁胜利的通道置为优先级最低,进行下次仲裁
class OfficialRRArbTest extends AnyFreeSpec with ChiselScalatestTester{"OfficialRRArbiter should pass" in {test(new RRArbiter(UInt(8.W), 3)).withAnnotations(Seq(WriteVcdAnnotation)) { c =>//第一次测试 此时从高到低优先级为0 1 2 通道0发起请求c.io.in(0).valid.poke(true.B)c.io.in(1).valid.poke(false.B)c.io.in(2).valid.poke(false.B)//假设在全部测试中通道0的数据为0 通道1的数据为1 通道2的数据为2c.io.in(0).bits.poke(0)c.io.in(1).bits.poke(1)c.io.in(2).bits.poke(2)c.io.out.ready.poke(true.B)c.clock.step(2)//初始状态下接收端已准备好接受in(0),in(1),in(2)  因此ready均为1//println(s"${c.io.in(0).ready.peek().litValue},${c.io.in(1).ready.peek().litValue},${c.io.in(2).ready.peek().litValue}")//通道0获胜,输出0println(s"1\t out.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}\n")//第二次测试  此时优先级从高到低为1 2 0 通道1发起请求c.io.in(0).valid.poke(false.B)c.io.in(1).valid.poke(true.B)c.io.in(2).valid.poke(false.B)c.clock.step(2)//通道1获胜,输出1println(s"2\t out.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}\n")//第三次测试  此时优先级从高到低为2 0 1 通道0和1发起请求c.io.in(0).valid.poke(true.B)c.io.in(1).valid.poke(true.B)c.io.in(2).valid.poke(false.B)c.clock.step(2)//通道0获胜,输出0println(s"3\t out.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}\n")//第四次测试  此时优先级从高到低为2 1 0 通道2发起请求c.io.in(0).valid.poke(false.B)c.io.in(1).valid.poke(false.B)c.io.in(2).valid.poke(true.B)c.clock.step(2)//通道2获胜,输出2println(s"4\t out.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}\n")//第五次测试  此时优先级从高到低为1 0 2 通道0和2发起请求c.io.in(0).valid.poke(true.B)c.io.in(1).valid.poke(false.B)c.io.in(2).valid.poke(true.B)c.clock.step(2)//通道0获胜,输出0println(s"5\t out.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}\n")//第六次测试 此时优先级从高到低为1 2 0 通道1和2发起请求c.io.in(0).valid.poke(false.B)c.io.in(1).valid.poke(true.B)c.io.in(2).valid.poke(true.B)c.clock.step(2)//通道1获胜,输出1println(s"6\t out.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}\n")//第七次测试 此时优先级从高到低为2 0 1 通道2、0、1发起请求c.io.in(0).valid.poke(true.B)c.io.in(1).valid.poke(true.B)c.io.in(2).valid.poke(true.B)c.clock.step(2)//通道2获胜,输出2println(s"7\t out.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}\n")}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/483943.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity MVC开发模式与开发流程详解

在Unity游戏开发中,采用MVC(Model-View-Controller)模式是一种非常常见的设计模式。MVC模式将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller&#x…

C++--输入一个数字判断是否是素数

一.算法思路 要判断数字n是否是素数&#xff0c;那么用n除以一个2~根号n的数字i&#xff0c;若有一个被整除&#xff0c;说明n不是素数&#xff0c;否则是素数 二.完整代码 #include<cmath> #include<iostream> bool IsPrime(int n) {for (int i 2;i < sqrt(n…

React学习——快速上手

文章目录 初步模块思维 初步 https://php.cn/faq/400956.html 1、可以手动使用npm来安装各种插件&#xff0c;来从头到尾自己搭建环境。 如&#xff1a; npm install react react-dom --save npm install babel babel-loader babel-core babel-preset-es2015 babel-preset-rea…

2024 年,向量数据库的性能卷到什么程度了?

对于数据库&#xff08;尤其是向量数据库&#xff09;而言&#xff0c;“性能”是一个十分关键的指标&#xff0c;其用于衡量数据库是否能够在有限资源内&#xff0c;高效处理大量用户请求。对于向量数据库用户而言&#xff0c;尽管可能在某些情况下对延时的要求不高&#xff0…

PostgreSQL 的实体化视图介绍

PostgreSQL 实体化视图提供一个强大的机制&#xff0c;通过预先计算并将查询结果集存储为物理表来提高查询性能。本教程将使用 DVD Rental Database 数据库作为演示例子&#xff0c;指导你在 PostgreSQL中创建实体化视图。 了解实体化视图 实体化视图是查询结果集的快照&…

【Nacos】构建云原生应用的动态服务发现、配置管理和服务管理平台【企业级生产环境集群搭建应用】

基础描述 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和…

使用maven集成spring在测试的时候报出了如下的异常:version 60

使用maven集成spring在测试的时候报出了如下的异常&#xff1a; Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 60 解决&#xff1a;

CSP-202309-3-梯度求解

CSP-202309-3-梯度求解 作为一个算法小白&#xff0c;本人第一次接触大模拟的题&#xff0c;本题的算法参考自&#xff1a;【CSP】202309-3 梯度求解 解题思路 1.输入处理 getchar();&#xff1a;从标准输入读取一个字符。这里它的作用可能是用来“吃掉”&#xff08;消耗&a…

Day17_集合与数据结构(链表,栈和队列,Map,Collections工具类,二叉树,哈希表)

文章目录 Day17 集合与数据结构学习目标1 数据结构2 动态数组2.1 动态数组的特点2.2 自定义动态数组2.3 ArrayList与Vector的区别&#xff1f;2.4 ArrayList部分源码分析1、JDK1.6构造器2、JDK1.7构造器3、JDK1.8构造器4、添加与扩容5、删除元素6、get/set元素7、查询元素8、迭…

2.2 request的使用

目录 2.2.1、request简介 2.2.2、GET请求 1 GET请求返回对象的一些属性 2 params 参数 3 response.text的真面目 2.2.1、request简介 提供爬虫需要的函数 2.2.2、GET请求 1 GET请求返回对象的一些属性 import requestsurl https://www.baidu.com/ response requests.…

Observability:使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型

作者&#xff1a; 来自 Elastic David Hope ChatGPT 现在非常火爆&#xff0c;甚至席卷了整个互联网。 作为 ChatGPT 的狂热用户和 ChatGPT 应用程序的开发人员&#xff0c;我对这项技术的可能性感到非常兴奋。 我看到的情况是&#xff0c;基于 ChatGPT 的解决方案将会呈指数级…

一样的代码不同项目跳转页面报404的解决办法

今天收到实施反馈的一个问题&#xff0c;点项目名称跳转项目详情页面时&#xff0c;有的页面跳转显示正常&#xff0c;有的页面跳转报404错误。错误如下&#xff1a; 发现报错的项目都有一个共性就是有特殊字符“[ ]” , 解决的办法就是把带有特殊字符的字段 用 encodeURI()…