【手撕AHB-APB Bridge】~ AHB地址总线的低两位为什么不用来表示地址呢?

【手撕AHB-APB Bridge】~ AHB地址总线的低两位为什么不用来表示地址呢?

本章目录:

0. 前言1. 低两位的作用2. 为什么ADDR低两位用来存储其他信息,而不表示地址信息呢?2. 关于solve...before...的说明2.1 没有solve...before...2.2 加上solve...before...

参考文献声明

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约束;

参考文献

第一问 第二问

声明

本人所有系列的文章,仅供学习,不可商用,如有侵权,请告知,立删!!!

本人主要是记录学习过程,以供自己回头复习,再就是提供给后人参考,不喜勿喷!!!

如果觉得对你有用的话,记得收藏+评论!!!

相关推荐

电信光纤一般是多少兆?
365速发彩票app下载旧版

电信光纤一般是多少兆?

📅 07-08 👁️ 8936
27日世界杯早报:梅西首球罗霍绝杀 阿根廷出线
mobile48365-365

27日世界杯早报:梅西首球罗霍绝杀 阿根廷出线

📅 07-18 👁️ 7997
微信如何设置特别提醒
mobile48365-365

微信如何设置特别提醒

📅 07-16 👁️ 1727