当前位置:网站首页>【手撕AHB-APB Bridge】~ AHB地址总线的低两位为什么不用来表示地址呢?
【手撕AHB-APB Bridge】~ AHB地址总线的低两位为什么不用来表示地址呢?
2022-08-01 07:18:00 【IC二舅】
本章目录:
0. 前言
如果大家还想继续看我的文章和笔试面试合集,麻烦大家关注一下我的 微信公众号,名字叫“IC二舅”,会有很多资料和各种合集都可以看得到,谢谢大家!!!
接下来回到正题===>
更新这篇博客是因为在做项目的过程中在遇到了问题,以下是简单的描述:
constraint haddr_constr{
(hsize == HWORD) -> (haddr[0] == 1'b0);
(hsize == WORD) -> (haddr[1:0] == 2'b0);
solve hsize before haddr;
}
起初不是很了解为什么要进行限制,学习之后明白了,以下是我的个人理解,希望大家批评指正!!!
1. 低两位的作用
AHB总线的低两位传递的信号不是用来表示数据的地址,表示数据地址的是除去低两位的剩余30位。如下图所示,HSIZE决定了传输的类型,是WORD、BYTE还是HALFWORD;在地址阶段,HADDR的低两位和HSIZE信号一起决定传输,分别存储在数据总线的哪些位置上。
大家可以观察图发现,HSIZE=00时,意味着传输的是BYTE,8位的,那么,HADDR就要决定你是存储在哪个八位上;同理,HIZE=01,那你HADDR的低一位就不起作用了,就是0;同理,HSIZE=10时,传输一个WORD,32位,那你的HADDR的两位都是0,这就是为什么要对其ADDR低两位进行限制。
2. 为什么ADDR低两位用来存储其他信息,而不表示地址信息呢?
主要原因是数据总线为32bit,数据交互的过程都是以32bit(4个字节)来进行的,如果只需要读写一个或者半个字,可以通过上面的方法取得。
因此,CORTEX-M核中,地址的偏移总是以“4”为单位进行偏移,因此低两位一直没有用到,因此用来存储其他信息了。如下图所示,地址每次偏移4字节,低两位就是没用到。
不论怎么样,低两位总是用不到更新地址,因为每次都是以4为单位递增,也就是从第三位开始递增。
2. 关于solve…before…的说明
之前在学习SV的时候,没见过这种约束,今天学习一下
(之前的约束可以参考另一篇博客:传送门)
SystemVerilog中随机变量在常见的约束(符号约束、inside约束、条件约束、内嵌约束)条件下,其随机值出现的概率是均等的。但是 使用solve…before约束后,将会改变随机数值的出现几率,使得某些特定的取值情况更易出现。
2.1 没有solve…before…
class transaction;
rand bit a;
rand bit[1:0] data;
constraint c1{
a -> data==3'h3;} //条件约束
endclass
module gen_data;
initial begin
transaction tr=new() ;
for(int i=0; i<10; i++ ) begin
tr.randomize() ;
$display("a= %0d, data= %0d",tr.a, tr.data) ;
end
end
endmodule
上边这个仅仅添加了一个条件约束,结果如下:
打印结果如下:
a= 0, data= 2;
a= 0, data= 2;
a= 0, data= 3;
a= 0, data= 1;
a= 0, data= 0;
a= 0, data= 2;
a= 1, data= 3;
a= 0, data= 3;
a= 0, data= 1;
a= 0, data= 1;
由于条件约束的存在,当a=1,data只能为3;而a=0,data可取0,1,2,3四种组合,所以共有5种组合,每种组合出现的概率相同,即1/5,如下表:
2.2 加上solve…before…
class transaction;
rand bit a;
rand bit[1:0] data;
constraint c1{
a -> data==3'h3; //条件约束
solve a before data;} //在给出data随机值之前先给出a的随机值
endclass
module gen_data;
initial begin
transaction tr=new() ;
for(int i=0; i<10; i++ ) begin
tr.randomize() ;
$display("a= %0d, data= %0d",tr.a, tr.data) ;
end
end
endmodule
除了有一个条件约束外,还增加了solve…before…,随机的结果的概率会发生改变。
打印结果如下:
a= 1, data= 3;
a= 0, data= 2;
a= 0, data= 3;
a= 0, data= 1;
a= 1, data= 3;
a= 0, data= 2;
a= 1, data= 3;
a= 0, data= 3;
a= 0, data= 1;
a= 0, data= 1;
由于 solve a before data约束的存在,随机变量a会先被赋予随机值,a为1或0的概率为1/2,接下来再为data随机变量赋随机值,其概率取决于a的值,如下表:
注意:randc类型变量不被允许使用solve…before约束;
参考文献
声明
本人所有系列的文章,仅供学习,不可商用,如有侵权,请告知,立删!!!
本人主要是记录学习过程,以供自己回头复习,再就是提供给后人参考,不喜勿喷!!!
如果觉得对你有用的话,记得收藏+评论!!!
边栏推荐
- 升级为重量级锁,锁重入会导致锁释放?
- How to use Photoshop to composite star trail photos, post-processing method of night sky star trail photos
- 聊一聊ICMP协议以及ping的过程
- matlab wind speed model wavelet filtering
- POJ1251丛林之路题解
- Golang: go static file processing
- Monitor the width and height of the parent element, adapt to the size of the plug-in
- 2022杭电多校第二场1011 DOS Card(线段树)
- 测试工具(四)Jenkins环境搭建与使用
- 奇葩问题 npm install 报错 gyp ERR
猜你喜欢
随机推荐
小程序通过云函数操作数据库【使用get取数据库】
Leetcode第 304 场周赛
Summary of test points about app updates in different ways
特殊的日子,值得纪念
MVVM项目开发(商品管理系统一)
爬虫框架 Scrapy 详解
对于升级go1.18的goland问题
Using FiddlerScript caught poly FiddlerScript 】 【 download
Golang: go static file processing
支付宝如何生成及配置公钥证书
头歌MySQL数据库实训答案 有目录
Matlab simulink particle swarm optimization fuzzy pid control motor pump
POJ2031空间站题解
史上超强最常用SQL语句大全
自制一款远程控制软件——VeryControl
拳头游戏免版权音乐下载,英雄联盟无版权音乐,可用于视频创作、直播
NIO编程
金山打字通 官网 下载
实战演练 Navicat 中英文模式切换
Golang:go获取url和表单属性值









