【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.pswp.cn/news/696361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696361.shtml
英文地址,請注明出處:http://en.pswp.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 線程組

簡述 操作路徑如下: 作用:在正式測試結束后執行清理操作,如關閉連接、釋放資源等。配置:設置清理操作的采樣器、執行順序等參數。使用場景:確保在測試結束后應用程序恢復到正常狀態,避免資源泄漏或對其他測試的影響。優點:提供清理操作,確保測試環境的整潔和可重復性…