基于LoongArch指令集-五级流水线CPU 乘除法指令的添加

调用Xilinx IP实现乘除法运算部件

  1. 调用Xilinx IP实现乘法运算部件
wire [31:0] src1,src2;
wire [63:0] unsigned_prod;
wire [63:0] signed_prod;assign unsigned_prod = src1*src2;
assign signed_prod = $signed(src1)*$signed(src2);
  1. 调用 Xilinx IP 实现除法运算部件
    在工程导航栏中点击“IP Catalog”,然后在右侧出现的窗口中搜索div。在搜索结果中双击“Divider Generator” 项,打开除法器 IP 设置界面,依次设置参数,如图5-2所示。
    对于除法器的名字,读者可以根据自己的喜好进行调整。在“Channel Settings” 选项卡中,我们首先要对除法器IP的算法进行选择,我们建议采用 Radix2 算法,采用Radix2这种算法实现的除法器的优点是资源消耗少,缺点是完成运算要求的迭代周期数多。
    在“Channel Settings”选项卡中还可以选择除法运算是有符号除法还是无符号除法。与前面介绍的乘法器IP类似,这里也需要生成有符号和无符号两个除法器IP,才能分别用于实现DIV和DIVU指令。将Remainder Type选择为Remainder,以确保余数类型是整数型。在“Options”选项卡中,选择多少拍处理一个除法,这个拍数是连续处理多个除法的间隔拍数,不是一个除法处理完成的拍数。
u_unsigned_div u_unsigned_divider (.aclk                   (clk),.s_axis_dividend_tdata  (divider_dividend),.s_axis_dividend_tready (unsigned_dividend_tready),.s_axis_dividend_tvalid (unsigned_dividend_tvalid),.s_axis_divisor_tdata   (divider_divisor),.s_axis_divisor_tready  (unsigned_divisor_tready),.s_axis_divisor_tvalid  (unsigned_divisor_tvalid),.m_axis_dout_tdata      (unsigned_divider_res),.m_axis_dout_tvalid     (unsigned_dout_tvalid)
);u_signed_div u_signed_divider (.aclk                   (clk),.s_axis_dividend_tdata  (divider_dividend),.s_axis_dividend_tready (signed_dividend_tready),.s_axis_dividend_tvalid (signed_dividend_tvalid),.s_axis_divisor_tdata   (divider_divisor),.s_axis_divisor_tready  (signed_divisor_tready),.s_axis_divisor_tvalid  (signed_divisor_tvalid),.m_axis_dout_tdata      (signed_divider_res),.m_axis_dout_tvalid     (signed_dout_tvalid)
);
  • s_axis_dividend_tdata 对应计算时输入的被除数数据
  • s_axis_divisor_tdata 对应计算时输入的除数数据
  • 计算得到的商和余数结果统一从商和余数通道中的64位信号m_axis_dout_tdata中输出。其中前32位是商,后32位是余数
  • tvalid、tready信号是一对“握手”控制信号,其工作原理类似于我们在CPU流水线之间使用的valid、allowin信号。tvalid是请求信号,tready是应答信号。当时钟上升沿到来时,如果采样得到tvalid和tready都等于1,则请求发起方和接收方之间完成一次成功的握手。
  • 我们 假设在执行流水阶段调用所生成的除法器IP。在除法指令处于执行流水级且没有对除法器成功输入数据的时候,同时将s_axis_dividend_tvalid和s_axis_divisor_tvalid置为1.当发现s_axis_dividend_tready和s_axis_divisor_tready反馈为1后(此时在一个时钟上升沿同时看到tvalid和tready为1,表示握手成功),需要将s_axis_dividend_tvalid和s_axis_divisor_tready清0.也就是确保握手成功的那个时钟上升沿之后的s_axis_dividend_tvalid和s_axis_divisor_tvalid为0.只要我们确保握手成功的那个时钟上升沿之后的s_axis_dividend_tvalid和s_axis_divisor_tready为0.只要我们保证s_axis_dividend_tvalid和s_axis_divisor_tready一定同时置为1,那么这里生成的除法器IP反馈的s_axis_dividend_tready和s_axis_divisor_tready一定也同时置为1.握手成功后,tvalid一定要撤销,否则对于除法器IP来说,它会认为又有一个新的除法运算。完成输入数据的握手之后,除法指令就需要在执行流水级等待除法器IP最终输出结果。当m_axis_dout_tvalid置为1时,表示除法计算完成。此时除法指令就可以从m_axis_dout_tdata上取出计算结果,进入流水线的后续阶段。
assign unsigned_dividend_tvalid = es_valid && (es_inst_div_wu | es_inst_mod_wu) && !unsigned_dividend_sent;
assign unsigned_divisor_tvalid  = es_valid && (es_inst_div_wu | es_inst_mod_wu) && !unsigned_divisor_sent;always @ (posedge clk) beginif (reset) beginunsigned_dividend_sent <= 1'b0;end else if (unsigned_dividend_tready && unsigned_dividend_tvalid) beginunsigned_dividend_sent <= 1'b1;end else if (es_ready_go && ms_allowin) beginunsigned_dividend_sent <= 1'b0;endif (reset) beginunsigned_divisor_sent <= 1'b0;end else if (unsigned_divisor_tready && unsigned_divisor_tvalid) beginunsigned_divisor_sent <= 1'b1;end else if (es_ready_go && ms_allowin) beginunsigned_divisor_sent <= 1'b0;end
endreg  signed_dividend_sent;
reg  signed_divisor_sent;assign signed_dividend_tvalid = es_valid && (es_inst_div_w | es_inst_mod_w) && !signed_dividend_sent;
assign signed_divisor_tvalid  = es_valid && (es_inst_div_w | es_inst_mod_w) && !signed_divisor_sent;always @ (posedge clk) beginif (reset) beginsigned_dividend_sent <= 1'b0;end else if (signed_dividend_tready && signed_dividend_tvalid) beginsigned_dividend_sent <= 1'b1;end else if (es_ready_go && ms_allowin) beginsigned_dividend_sent <= 1'b0;endif (reset) beginsigned_divisor_sent <= 1'b0;end else if (signed_divisor_tready && signed_divisor_tvalid) beginsigned_divisor_sent <= 1'b1;end else if (es_ready_go && ms_allowin) beginsigned_divisor_sent <= 1'b0;end
end

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

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

相关文章

Trie 前缀树 字典树

PreFix Tree 二叉树 的每个节点只有两个孩子,那如果每个节点可以有多个孩子呢?这就形成了「多叉树」。多叉树的子节点数目一般不是固定的,所以会用变长数组来保存所有的子节点的指针。 「前缀树」是一种特殊的多叉树,它的 TrieNode 中 chidren 是一个大小为 26 的一维数组…

自压缩llm 为 超长记忆

自压缩llm 为 超长记忆 解释数据处理实际例子解释 # 自压缩llm 为 超长记忆 # prompt 格式 # <|细颗粒词表|><|粗颗粒词表|><|细颗粒词表|> # 细颗粒词表 = 词1,词2,词3,词4,词5,词6,词7,词8,词9,词10, # 组颗粒词表id1, 组颗粒词表id2, 组颗粒…

一篇博客读懂队列——Queue

目录 一、队列的概念和结构 ​二、队列的实现 2.1队列的初始化QueueInit 2.2队列的摧毁QueueDestroy 2.3插入结点QueuePush 2.4删除结点QueuePop 2.5返回队头QueueFront 2.6返回队尾QueueBack 2.7判断队列为空QueueEmpty 2.8统计队列数目QueueSize 一、队列的概念和…

C#动态数据类型

static void Main(string[] args){dynamic point new {x 15,y 10};DrwaPoint(point);System.Console.Read();}static void DrwaPoint(dynamic point) >System.Console.WriteLine($"x:{point.x},y:{point.y}");

【nlp】1.4 文本特征处理(n-gram特征、文本长度规范:补齐与截断)

文本特征处理 1 什么是n-gram特征2 文本长度规范及其作用文本特征处理的作用: 文本特征处理包括为语料添加具有普适性的文本特征,如:n-gram特征,以及对加入特征之后的文本语料进行必要的处理, 如: 长度规范。这些特征处理工作能够有效的将重要的文本特征加入模型训练中,增强…

设计模式介绍

写在前面的话 以前也学习过设计模式&#xff0c;但是总感觉学不懂&#xff0c;最近开发项目深刻感受到设计模式的重要性&#xff0c;系统学习一些。 我是观看油管上李建忠老师的视频学习做的总结&#xff0c;会不断补充&#xff0c;欢迎大家指出错误&#xff0c;学习进步。 …

k8s ----对外暴露

目录 一、Ingress 简介 1、Ingress 组成 2、Ingress 工作原理 二、部署Ingress 1、部署 nginx-ingress-controller 2、暴露ingress 4.1 DaemonSetHostNetworknodeSelector模式的service 4.2 DeploymentNodePort模式的Service 三、Ingress HTTP 代理访问 四、Ingress …

数据结构与算法【递归】Java实现

递归 递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集。 特点&#xff1a; 自己调用自己&#xff0c;如果说每个函数对应着一种解决方案&#xff0c;自己调用自己意味着解决方案是一样的&#xff08;有规律的&#xff09;每次调用&#xf…

计算机毕业设计选题推荐-体育赛事微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

图像分类:对google/vit-large-patch32-384模型进行微调

背景&#xff1a; 图像分类是很常见的场景&#xff0c;比如日常的物体识别&#xff0c;可很多时候我们还需要根据自己的数据来训练自己的分类&#xff0c;大模型出现以后&#xff0c;我们不需要再重头来训练我们的模型&#xff0c;直接根据已经训练好的大模型进行微调即可&…

Oracle(2-1) Networking Overview

文章目录 一、基础知识1、Network Environ Challenges 网络环境挑战2、Simple Network :2-Tier 简单的两层网络3、Simple to Complex : N-Tier 简单到复杂&#xff1a;N层网络4、Oracle Network Solutions Oracle网络解决方案5、Key Features of Oracle Net Oracle Net的主要功…

JavaWeb篇_09——Tomcat运行过程以及Servlet继承结构

Tomcat运行过程 用户访问localhost:8888/test/helloword.do&#xff0c;请求被发送到Tomcat&#xff0c;被监听8888端口并处理 HTTP/1.1 协议的Connector获得。Connector把该请求交给它所在的Service的Engine来处理&#xff0c;并等待Engine的回应。Engine获得请求localhost/t…

酷柚易汛ERP-购货订单操作指南

1、应用场景 先下购货订单&#xff0c;收货入库后生成购货单。 2、主要操作 2.1 新增购货订单 打开【购货】-【购货订单】新增购货订单。&#xff08;*为必填项&#xff0c;其他为选填&#xff09; ① 录入供应商&#xff1a;点击供应商字段框的 &#xff0c;在弹框中选择供…

买房和租房哪个划算?

目录 1、考虑因素 1. 1费用比较 1.2 资产增值 1.3 税收影响 1.4 灵活性 1.5 贷款利率 1.6 长期计划 1.7 当地市场条件 2、买房计算 2.1等额本息 2.2等额本金 3、租房计算 1、考虑因素 在比较买房和租房哪个更划算时&#xff0c;需要考虑多个因素。以下是一些可以考…

客户下单时如何自动匹配到最近的门店

有些商家有多个门店&#xff0c;当客户下单时&#xff0c;希望能够将客户下的订单分配给最近的门店。下面就具体介绍一下在采云小程中是如何实现的。 首先&#xff0c;为了简便起见&#xff0c;请确定门店高级设置保持着默认设定。因为单独的商品管理模式以及独享的商品信息模…

【milkv】0、duo编译环境搭建

一、开发资料整理 Docker https://hub.docker.com/repository/docker/dreamcmi/cv1800-docker/general GitHub https://github.com/milkv-duo/duo-buildroot-sdk CV181x/CV180x MMF SDK 开发文档汇总 https://developer.sophgo.com/thread/471.html cv181x芯片使用的交叉…

CCF 备忘

一、不错的网站 CCF CCSP 竞赛历年资料 官网 http://118.190.20.162/home.page 二、基础套路 循环输入 数组标记法&#xff08;数组下标-数值 的映射&#xff09; 两个矩阵相乘 map<long long, map<long long, long long> > ans; for(int i1;i<d;i){for(int…

长按事件怎么加定时器

要实现长按事件并加入定时器&#xff0c;你可以结合使用mousedown和mouseup事件&#xff0c;然后在mousedown时启动定时器&#xff0c;在mouseup时停止定时器。以下是一个使用Vue.js的例子&#xff1a; <template><div><p>长按计时器示例: {{ timerValue }}…

【Linux】 ls -l 和 grep

语法:用于显示指定工作目录下之内容 ls [-alrtAFR] [name...]将 /bin 目录以下所有目录及文件详细资料列出: ls -lR /bin将 /usr/local/bin 目录以下所有有关python列出: ls -l /usr/local/bin/ | grep python在使用 ls -l 命令时&#xff0c;第一列的字符表示文件或目录的类…

js 加密解密 cryptojs(对称加密库)

js 加密解密可以使用 crypto-js 这是一个对称加密的库&#xff0c; 可以使用 AES DES 但没有 rsa 等非对称加密的方法 安装方法 npm install crypto-js 它可以进行 MD5 SHA-1 SHA-256 Base64 AES DES 等算法和加密 import crypto from "crypto-js"let md5binary cry…