【Verilog-CBB】开发与验证(4)——RS前向打拍器

news2024/10/1 17:15:39

b86aadd42ed74a66b80d48b5a5cfb51c.png



引言

我们知道时序路径的建立时间收敛依赖于触发器之间的组合逻辑延迟,以及时钟周期。对于一个确定的设计一般来说,时钟频率不会有太多的让步,因此修时序的时候主要发力点就是减小触发器之间组合逻辑延迟。一方面可以通过组合逻辑优化来降低组合逻辑延迟,另一方面也可以通过插入寄存器来优化时序。register slice 在数字设计中常用来打断前后级的逻辑(握手型总线协议),保证timing收敛,同时实现pipeline的高性能效果。AXI协议是目前广泛采用的总线协议(握手型总线协议)。为了使总线能够跑上更高的频率,获得更好的timing性能,register slice 被广泛采用,用于切断/分割AXI总线的critical timing path。

RS(register slice)前向打拍器则是针对握手型(valid-ready)接口的valid时序优化(建立时间)。握手型信号在打拍时是不能简单的对valid信号打拍的,还需要对数据信号同步打拍。否则valid和data就不能对齐,出现逻辑错误。

RS前向打拍器的逻辑其实比较容易理解,可以理解为深度为1的buffer,从侧ready拉高的逻辑为主侧ready拉高或者当前valid buffer的输出为低电平(表示valid 的buffer空)。从侧的valid和ready握手成功时,数据由从侧寄存一拍输出到主侧。

可以结合时序图理解一下:

b64e8c622d5b4f8da39700cc8f09197e.png

CBB设计源码

// ==================-------------------------------------------------------=====================
//                                        在路上-正出发
//                                    Common Building Block
// ==================-------------------------------------------------------=====================

//                 ________          ________          ________                                                               
//                |\   ____\        |\   __  \        |\   __  \                                                              
//                \ \  \___|        \ \  \|\ /_       \ \  \|\ /_                                                             
//                 \ \  \            \ \   __  \       \ \   __  \                                                            
//                  \ \  \____        \ \  \|\  \       \ \  \|\  \                                                           
//                   \ \_______\       \ \_______\       \ \_______\                                                          
//                    \|_______|        \|_______|        \|_______|  

// ==================-------------------------------------------------------=====================
//                                        在路上-正出发
//                                    Common Building Block
// ==================-------------------------------------------------------=====================                                                                                                              
                                                                                                                                                                                                                                                                                                         
// CBB Module Name    :CBB_RS_FORWARD
// CBB Created Date   :2024-08-04
// CBB Module Function:Register Slice mode:forward
// Usage Limitation   :
// Author             :在路上-正出发
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------

`timescale 1ns/1ps

module  CBB_RS_FORWARD #(
// ---- parameter define
parameter P_DATA_WIDTH 		= 64
)(
// ---- port define 
input 						i_clk,
input 						i_rstn,

input 						slv_i_valid,
input [P_DATA_WIDTH-1:0] 	slv_i_data,
output 						slv_o_ready,

output 						mst_o_valid,
output [P_DATA_WIDTH-1:0] 	mst_o_data,
input 						mst_i_ready
);

reg 						r_mst_o_valid;
reg [P_DATA_WIDTH-1:0] 		r_mst_o_data;

assign slv_o_ready = mst_i_ready || (~r_mst_o_valid);

always @(posedge i_clk or negedge i_rstn) begin : proc_valid
	if(~i_rstn) begin
		 r_mst_o_valid <= 1'b0;
	end else if (slv_o_ready)begin
		 r_mst_o_valid <= slv_i_valid;
	end
end

always @(posedge i_clk)begin:proc_data
	if(slv_i_valid & slv_o_ready) begin
		r_mst_o_data <= slv_i_data;
	end
end

assign mst_o_valid = r_mst_o_valid;
assign mst_o_data  = r_mst_o_data;
endmodule

CBB验证

从侧 valid信号拉高的时间间隔随机,且拉高的时机与ready无关,主侧ready信号拉高的持续时间随机,相邻两个高电平之间的间隔随机。包括各种反压case。

验证源码

// ==================-------------------------------------------------------=====================
//                                        在路上-正出发
//                                    Common Building Block
// ==================-------------------------------------------------------=====================

//                 ________          ________          ________                                                               
//                |\   ____\        |\   __  \        |\   __  \                                                              
//                \ \  \___|        \ \  \|\ /_       \ \  \|\ /_                                                             
//                 \ \  \            \ \   __  \       \ \   __  \                                                            
//                  \ \  \____        \ \  \|\  \       \ \  \|\  \                                                           
//                   \ \_______\       \ \_______\       \ \_______\                                                          
//                    \|_______|        \|_______|        \|_______|  

// ==================-------------------------------------------------------=====================
//                                        在路上-正出发
//                                    Common Building Block
// ==================-------------------------------------------------------=====================                                                                                                              
                                                                                                                                                                                                                                                                                                         
// CBB Module Name    :TB_RS_FORWARD
// CBB Created Date   :2024-08-04
// CBB Module Function:
// Usage Limitation   :
// Author             :在路上-正出发
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------

`timescale 1ns/1ps

module  TB_RS_FORWARD();
// ---- parameter define
parameter P_DATA_WIDTH 		= 32;

// ---- port define 
reg 						i_clk;
reg 						i_rstn;

reg 						slv_i_valid;
reg [P_DATA_WIDTH-1:0] 		slv_i_data;
wire 						slv_o_ready;

wire 						mst_o_valid;
wire [P_DATA_WIDTH-1:0] 	mst_o_data;
reg 						mst_i_ready;

initial i_clk = 1'b0;
always #5 i_clk = ~i_clk;

integer time_dly1,time_dly2;


initial
begin
	i_rstn = 1'b0;
	mst_i_ready = 1'b0;
	#20;
	i_rstn = 1'b1;
	#20;
	repeat(20)
	begin
		time_dly1 = $urandom_range(1,10);
		repeat(time_dly1)
		begin
			@(posedge i_clk);
		end
		@(posedge i_clk)
		mst_i_ready <= 1'b1;

		time_dly1 = $urandom_range(1,10);
		repeat(time_dly1)
		begin
			@(posedge i_clk);
		end
		@(posedge i_clk)
		mst_i_ready <= 1'b0;
	end
end

initial
begin
	slv_i_valid = 1'b0;
	slv_i_data  = 0;
	@(posedge i_rstn);
	#20;
	repeat(20)
	begin
		@(posedge i_clk)
		slv_i_valid <= 1'b1;
		slv_i_data  <= $random();
		while(~slv_o_ready) @(posedge i_clk);
		@(posedge i_clk)
		slv_i_valid <= 1'b0;
		slv_i_data  <= 0;

		time_dly2 = $urandom_range(1,10);
		repeat(time_dly2) @(posedge i_clk);
	end
	#100;
	$finish;
end

CBB_RS_FORWARD #(
		.P_DATA_WIDTH(P_DATA_WIDTH)
	) U_CBB_RS_FORWARD (
		.i_clk       (i_clk),
		.i_rstn      (i_rstn),
		.slv_i_valid (slv_i_valid),
		.slv_i_data  (slv_i_data),
		.slv_o_ready (slv_o_ready),
		.mst_o_valid (mst_o_valid),
		.mst_o_data  (mst_o_data),
		.mst_i_ready (mst_i_ready)
	);

endmodule

波形

528f4724c6064c7cac140751eaccfc70.png

CBB综合

3f31222a3be94115ba150f0450371ab3.png

 

综合结果,可以明确看出,前向RS打拍器对输入数据以及valid信号做了打拍处理,完全切断了从侧与主侧valid 以及data的timing path,有助于这两个信号的建立时间收敛。但是ready信号则是通过组合逻辑由主侧传递到从侧,并没有切断从侧与主侧的timing path,因此前向打拍器不能够优化ready信号的时序。

 

 

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

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

相关文章

Studying-代码随想录训练营day56| 108.冗余连接、109.冗余连接II

第56天&#xff0c;图论06&#xff0c;并查集题目类型冗余连接(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 108.冗余连接 109.冗余连接II 总结 108.冗余连接 文档讲解&#xff1a;手撕冗余连接 题目&#xff1a;108. 冗余连接 (kamacoder.com) 学习&…

SpringSecurity-3(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)

SpringSecurity使用数据库数据完成认证 5 SpringSecurity使用数据库数据完成认证5.1 认证流程分析5.1.1 UsernamePasswordAuthenticationFilter5.1.2 AuthenticationManager5.1.3 AbstractUserDetailsAuthenticationProvider5.1.4 AbstractUserDetailsAuthenticationProvider中…

跟《经济学人》学英文:2024年08月03日这期 How to make tourism work for locals and visitors alike

How to make tourism work for locals and visitors alike Holidays don’t have to be hell 原文&#xff1a; The dollar is hovering near a two-decade high. That has unleashed a multitude of American tourists keen to exercise their newfound spending power, m…

图的应用---最短路径

目录 一. 前言 二. Dijkstra算法 三. Floyd算法 一. 前言 所谓最短路径&#xff1a;就是在有向网当中&#xff0c;A点&#xff08;源点&#xff09;到达B点&#xff08;终点&#xff09;的多条路径中&#xff0c;寻找一条各边权值之和最小的路径&#xff0c;即最短路径。 如果…

Linux--TCP协议

传输层协议TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;会对数据的传输进行一个详细的控制。 TCP协议段格式 TCP协议段格式是TCP协议在网络传输数据时所使用的结构单…

Google paly开发者账号因恶意软件被封,也能申诉成功?怎么做?

想必在Google Play上摸爬滚打多年的各位开发者&#xff0c;在面对谷歌那似乎越来越严格的审核机制&#xff0c;都遭遇过应用被下架、账号被封的困境。 尤其是当你的应用被莫名其妙地判定为恶意软件&#xff0c;然后账号被封&#xff0c;更是让人头疼不已。 但别急&#xff0c;虽…

flutter开发环境搭建与android studio 安装配置

flutter开发环境搭建与android studio 安装配置 安装 android studio 下载安装 Android Studio 开发工具 Android Studio官网安装的时看到配置路径就换成自己其他盘的路径即可&#xff0c;其他的一路下一步就ok安装完毕&#xff0c;运行打开缺少 android sdk 按照提示下载即可…

python nicegui实现TodoList应用案例

参考&#xff1a; https://nicegui.io/ https://nicegui.io/#demos 版本 nicegui 1.4.30代码&#xff1a; python todolist.py from nicegui import ui from typing import List import jsonclass Todo:def __init__(self, text: str, completed: b…

连载|浅谈红队中的权限维持(六)-Linux 主机后门与Linux 隐藏文件

本文来源无问社区&#xff0c;更多实战内容&#xff0c;渗透思路可前往查看http://www.wwlib.cn/index.php/artread/artid/11584.html 0x01 Linux 主机后门 1、添加用户 一句话添加用户 useradd test;echo -e "123456n123456n" |passwd test 或者使用 openssl …

测试——Selenium

内容大纲: 什么是自动化测试 什么是Selenium Selenium工作原理 Selenium环境搭建 Selenium API 目录 1. 什么是自动化测试 2. 什么是Selenium 3. Selenium工作原理 4. Selenium环境搭建(java) 5. Selenium API 5.1 定位元素 5.1.1 CSS选择器定位元素 5.1.2 XPath定位元…

arr的谜思

arr到底是个啥&#xff1f; 在C语言中&#xff0c;arr 本身不是一个指针&#xff0c;而是一个数组名。然而&#xff0c;在大多数表达式中&#xff0c;数组名会被转换为指向数组首元素的指针。这种转换是自动的&#xff0c;并且是C语言的一个基本特性。 具体来说&#xff0c;当…

LDR6020快充线,科技与便捷的新宠

在快节奏的现代生活中&#xff0c;充电效率成为了我们不可忽视的一个重要因素。随着智能手机、平板电脑等电子设备的普及&#xff0c;快充线以其独特的优势逐渐成为充电设备市场的新宠。 快充线&#xff0c;相比于传统的普通充电线&#xff0c;快充线在充电速度上有着显著的提升…

Linux用户-sudo命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux是一个多用户多任务操作系统,这意味着它可以同时支持多个用户登录并使用系统。…

明日周刊-第19期

演唱会现场的感受确实跟耳机里的感觉非常不一样&#xff0c;听见音响和人声真真切切出现在你身边&#xff0c;那种震撼可以让你暂时忘却生活的烦恼。感谢8月3日的蔡健雅演唱会&#xff0c;凑巧的是这一场是今年巡演的最后一场。 文章目录 资源分享言论歌曲推荐 资源分享 nginx…

DC-8靶机通关

今天我们来学习DC-8这个靶机&#xff01;&#xff01;&#xff01; 1.实验环境 攻击机&#xff1a;kali2023.2 靶机&#xff1a;DC-8 2.1主机扫描 2.2端口扫描 还是熟悉的配方&#xff01;&#xff01;&#xff01; 3.1查看网页 其实可以先尝试一下爆破&#xff0c;但是爆…

在VScode中导入conda环境的记录【原创】

今天在vscode编辑器中运行一个python代码&#xff0c;发现终端可以运行&#xff0c;但是编辑器中点击Run会显示缺包&#xff0c;但是python包明明是有的&#xff0c;在自己的conda环境中。后来发现&#xff0c;是vscode没有发现我自己创建的conda环境&#xff0c;在vscode中导入…

暑假第三周——学生管理系统仿写

iOS学习 前言账号界面主页添加学生信息&#xff1a;修改学生信息&#xff1a;删除学生信息&#xff1a;学生信息排序&#xff1a;查找学生信息 总结 前言 学生管理系统的仿写较为简单&#xff0c;与c语言的学生管理系统逻辑上相差不大。 账号界面 账号界面与3G share的相同&am…

推荐几款卓越的 .NET 开源搜索组件

目录 前言 一、Lucene.NET 1、介绍 2、地址 二、Elasticsearch.NET 和 NEST 1、介绍 2、文档地址 3、开源地址 三、Algolia.Search 1、介绍 2、文档地址 3、开源地址 四、SolrNet 1、介绍 2、文档开源地址 3、Solr社区 五、Masuit.LuceneEFCore.SearchEngine …

网页设计师必备!10个免费的设计素材网站推荐

当网页设计师使用网页设计材料时&#xff0c;他们会优先考虑那些免费和高质量的网页设计材料网站。找到一个免费和高质量的网页设计材料网站并不容易&#xff0c;有些网站要么需要打开材料网站成员&#xff0c;要么设计材料质量很差。即时设计总结了10个免费的网页设计材料网站…

iAppv3无白银会员使用SDK

前言 一个实用小技巧分享给大家。 工具 iapp&#xff1a;百度或点我获取 Mt管理器&#xff1a;百度或点我获取 教程 1.移出“项目路径/apk/lib/”内的全部文件 2.在iapp内测试打包&#xff0c;打包完成后直接返回&#xff0c;不要安装 3.在mt管理器里面点击“项目路径/b…