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

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

参考文献

第一问
第二问

声明

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

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

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

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值