【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.mzph.cn/news/696361.shtml

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

相关文章

前端构建效率优化之路

项目背景 我们的系统(一个 ToB 的 Web 单页应用)前端单页应用经过多年的迭代,目前已经累积有大几十万行的业务代码,30 路由模块,整体的代码量和复杂度还是比较高的。 项目整体是基于 Vue TypeScirpt,而构…

ProtoBuf认识与Windows下的安装

protobuf简介 Protobuf 是 Protocol Buffers 的简称,它是 Google 公司开发的一种数据描述语言,是一种轻便高效的结 构化数据存储格式,可以用于结构化数据,或者说序列化。它很适合做数据存储 或 RPC 数据交换格 式 。可用于通讯…

WebServer -- 定时器处理非活动连接(上)

目录 🍍函数指针 🌼基础知识 🐙整体概述 🎂基础API sigaction 结构体 sigaction() sigfillset() SIGALRM, SIGTERM 信号 alarm() socketpair() send() 📕信号通知流程 统一事件源 信号处理机制 &#x…

2024全球网络安全展望|构建协同生态,护航数字经济

2024年1月,世界经济论坛发布《2024全球网络安全展望》报告,指出在科技快速发展的背景下,网络安全不均衡问题加剧,需加强公共部门、企业组织和个人的合作。 报告强调,面对地缘政治动荡、技术不确定性和全球经济波动&am…

基于springboot+vue的美发门店管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Python 高级语法:一切皆对象

1 “一切皆对象”是一种核心设计哲学 在编程领域,特别是面向对象编程(OOP)中,“一切皆对象”是一种核心设计哲学。这种哲学主张,无论是数据、函数、还是更复杂的结构,都可以被视为对象,并赋予…

信息安全基本概念汇总

目录 一、安全加密算法相关 二、信息安全需求规范相关 三、安全启动 四、安全更新 五、安全通信SecOC 六、HSM安全固件整体架构 一、安全加密算法相关 基于Autosar的网络安全理解_搜狐汽车_搜狐网 基于AES的CMAC算法、MAC、Hash、数字签名之间的关系_aes cmac-CSDN博客…

Cartographer框架简述

catographer框架分为前端和后端 前端包括雷达数据处理;位姿预测;扫描匹配和栅格地图更新。 后端包括后端:线程池任务与调度;向位姿图添加节点,计算节点的子图内约束和子图间约束(回环检测)&…

C++之Easyx——图形库的基本功能(1):界面操作

最近,我觉得使用控制台编写游戏太没意思了!! 所以我开始研究图形库了~ 一、setinitmode 函数定义 void EGEAPI setinitmode(int mode, int x CW_USEDEFAULT, int y CW_USEDEFAULT); //设置初始化模式,mode0为普通&#xff0c…

Spark中写parquet文件是怎么实现的

背景 本文基于 Spark 3.5.0 写本篇文章的目的是在于能够配合spark.sql.maxConcurrentOutputFileWriters参数来加速写parquet文件的速度,为此研究一下Spark写parquet的时候会占用内存的大小,便于配置spark.sql.maxConcurrentOutputFileWriters的值&#…

Javascript怎么输出内容?两种常见方式以及控制台介绍

javascript是一种非常重要的编程语言,在许多网页中它被广泛使用,可以实现许多交互效果和动态效果。输出是javascript中最基本的操作之一,下面将介绍两种常见的输出方式。 一、使用console.log()函数输出 console.log()函数是常用的输出函数…

Jmeter实现阶梯式线程增加的压测

安装相应jmeter 插件 1:安装jmeter 管理插件: 下载地址:https://jmeter-plugins.org/install/Install/,将下载下来的jar包放到jmeter文件夹下的lib/ext路径下,然后重启jmeter。 2:接着打开 选项-Plugins Ma…

在Linux上安装Docker: 一站式指南

Docker 是一款强大的容器化平台,为开发者提供了一种轻松打包、发布和运行应用的方式。在本文中,我们将探讨如何在Linux操作系统上安装Docker,为你提供一站式指南。 步骤1: 卸载旧版本 在安装新版Docker之前,建议先卸载旧版本&am…

三十年一个大轮回!日股突破“泡沫时期”历史高点

2月22日周四,英伟达四季报业绩超预期,而且本季度业绩指引非常乐观,提振美股股指期货并成为芯片股和AI概念股情绪的重要催化剂。今日亚洲芯片股和AI股起飞,日本在芯片股的带动下突破1989年泡沫时期以来的历史最高收盘价。 美股方面…

我之前炒股亏麻了,找百融云AI Agent谈了谈心

春节之前,A股和H股都跌麻了,但是机构的路演和调研反而多了。因为:写不完的安抚、说不完的陪伴、听不完的客户指责、以及捡不完的AH股便宜货。 有一位血液里流淌着美式咖啡的职场白领,虽然这些年在股市过得很不如意,但…

C语言---链表

一.定义 链表是由一系列节点组成,每个结点包含两个域,一个是数据域,数据域用来保存用户数据,另一个是指针域,保存下一个节点的地址。链表在内存中是非连续的。 二.分类 静态链表 动态链表 单向链表 双向链表 循环链…

maven使用问题及解决办法汇总

文章目录 1、maven clean后打包出现Cannot create resource output directory2、把已有jar包打包进本地maven仓库 1、maven clean后打包出现Cannot create resource output directory 主要原因是target目录被别的程序占用了,最笨的办法是重启电脑,当然也…

C++跨模块释放内存

linux一个进程只有一个堆,不要考虑这些问题,但是windows一个进程可能有多个堆,要在对应的堆上释放。 一, MT改MD 一个进程的地址空间是由一个可执行模块和多个DLL模块构成的,这些模块中,有些可能会链接到…

代码随想录训练营第29天| 491.递增子序列、46.全排列、47.全排列 II

491.递增子序列 题目链接&#xff1a;491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<List<Integer>> ans new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {backtrack(nums, …

(十三)【Jmeter】线程(Threads(Users))之tearDown 线程组

简述 操作路径如下: 作用:在正式测试结束后执行清理操作,如关闭连接、释放资源等。配置:设置清理操作的采样器、执行顺序等参数。使用场景:确保在测试结束后应用程序恢复到正常状态,避免资源泄漏或对其他测试的影响。优点:提供清理操作,确保测试环境的整洁和可重复性…