• 【手撕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
    • 2
    • 3
    • 4
    • 5

    起初不是很了解为什么要进行限制,学习之后明白了,以下是我的个人理解,希望大家批评指正!!!

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    上边这个仅仅添加了一个条件约束,结果如下:

    打印结果如下:
    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    由于条件约束的存在,当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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    除了有一个条件约束外,还增加了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;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    由于 solve a before data约束的存在,随机变量a会先被赋予随机值,a为1或0的概率为1/2,接下来再为data随机变量赋随机值,其概率取决于a的值,如下表:
    在这里插入图片描述
    注意:randc类型变量不被允许使用solve…before约束;

    参考文献

    第一问
    第二问

    声明

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

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

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

  • 相关阅读:
    【C语言】-结构体内存对齐。附详细图解
    《深入浅出Python量化交易实战》:散户也能学会的数字化交易策略
    GIC/ITS代码分析(5)exception处理流程
    ElasticSearch(ES)简单介绍
    QML android 采集手机传感器数据 并通过udp 发送
    【已解决】Vue3+Element-plus中icon图标不显示的问题
    爬虫为什么需要 HTTP 代理 IP?
    tar.gz文件修复
    二叉树基础知识总结
    Java中JVM虚拟机详解
  • 原文地址:https://blog.csdn.net/qq_40549426/article/details/126087954