AHB_Bus_Matrix_3x3 设计

本文详细介绍了AHB_Bus_Matrix_3x3的设计,包括功能描述、架构和逻辑设计。在多主多从的AHB系统中,该矩阵通过decoder进行地址解码和片选,并通过arbiter实现多个主设备访问同一从设备时的仲裁。文中提到了arbiter的多种算法实现,以及decoder如何根据主设备的HADDR信息进行片选。


1. 功能描述

当多个AHB master与多个AHB slave进行通信时,就可以使用一个基于AHB协议的bus matrix实现互联。

例如

在这里插入图片描述

2. 架构

根据之前的描述,一主多从系统需要decoder对Master的HADDR进行解码以对不同的Slave进行片选,同时Slave读取的数据也需要MUX根据片选结果返回给Master。此处 bus matrix设计就将decoder与MUX合并为decoder,并为每一个Master配一个decoder。

对于每一个Slave来说,同一时间可能有多个Master对其进行访问,因此需要arbiter实现仲裁,因此暂定bus matrix的架构如下:

在这里插入图片描述

2.1. ahb_bus_matrix_3x3

接口如下

Group
// 通用Transaction基类 class bus_trans_base extends uvm_sequence_item; `uvm_object_utils(bus_trans_base) rand bit [31:0] addr; rand bit [31:0] data; bus_rw_e rw; pure virtual function void to_prot_trans(uvm_object prot_trans); pure virtual function void from_prot_trans(uvm_object prot_trans); function new(string name = "bus_trans_base"); super.new(name); endfunction endclass // 通用Agent代理基类 class bus_agent_proxy extends uvm_agent; `uvm_component_utils(bus_agent_proxy) uvm_sequencer prot_sqr; pure virtual function void bind_prot_sqr(); // 绑定封闭Sequencer virtual function uvm_sequencer get_sqr(); return prot_sqr; endfunction function new(string name, uvm_component parent); super.new(name, parent); endfunction endclass // 通用Sequence基类(封装seq.start(sequer_ip)) class bus_seq_base extends uvm_sequence; `uvm_object_utils(bus_seq_base) bus_trans_base trans; uvm_sequencer prot_sqr; // 配置传递的IP Sequencer pure virtual task do_transfer(); // 协议特有传输逻辑 virtual task body(); do_transfer(); endtask function new(string name = "bus_seq_base"); super.new(name); endfunction endclass // 通用DPI层 class dpi_adapter extends uvm_component; `uvm_component_utils(dpi_adapter) bus_agent_proxy agent_proxy; export "DPI-C" function c_bus_rw; function new(string name, uvm_component parent); super.new(name, parent); endfunction function int c_bus_rw(int addr, int data, int rw); bus_trans_base trans = bus_trans_base::type_id::create("trans"); // 工厂自动替换为适配类 bus_seq_base seq = bus_seq_base::type_id::create("seq"); trans.addr = addr; trans.data = data; trans.rw = (rw==1) ? BUS_WRITE : BUS_READ; seq.trans = trans; seq.start(agent_proxy.get_sqr()); // 固定调用范式 seq.do_transfer(); return int'(trans.resp); endfunction endclass // AHB Transaction适配类(继承封闭ahb_trans) class ahb_trans_adapter extends bus_trans_base; `uvm_object_utils(ahb_trans_adapter) virtual function void to_prot_trans(uvm_object prot_trans); ahb_trans_ext ahb_t; $cast(ahb_t, prot_trans); ahb_t.addr = this.addr; ahb_t.data = this.data; endfunction virtual function void from_prot_trans(uvm_object prot_trans); ahb_trans_ext ahb_t; $cast(ahb_t, prot_trans); this.resp = (ahb_t.resp == AHB_OK) ? RESP_OK : RESP_ERR; endfunction endclass // AHB Agent代理类 class ahb_agent_proxy extends bus_agent_proxy; `uvm_component_utils(ahb_agent_proxy) ahb_agent ahb_agt; virtual function void bind_prot_sqr(); ahb_agt = ahb_agent::type_id::create("ahb_agt", this); prot_sqr = ahb_agt.get_sqr(); // 绑定封闭Sequencer endfunction endclass // 可修改的AHB Sequence class ahb_seq_adapter extends bus_seq_base; `uvm_object_utils(ahb_seq_adapter) ahb_trans_ext ahb_t; virtual task do_transfer(); $cast(ahb_t, trans); trans.to_prot_trans(ahb_t); do_ahb_rw(ahb_t); // 修改后的Sequence逻辑 trans.from_prot_trans(ahb_t); endtask endclass class test_ahb extends uvm_test; `uvm_component_utils(test_ahb) env_top env; function new(string name, uvm_component parent); super.new(name, parent); endfunction virtual function void build_phase(phase); // 工厂覆盖:抽象基类→AHB适配类 set_type_override_by_type(bus_trans_base::get_type(), ahb_trans_adapter::get_type()); set_type_override_by_type(bus_agent_proxy::get_type(), ahb_agent_proxy::get_type()); set_type_override_by_type(bus_seq_base::get_type(), ahb_seq_adapter::get_type()); env = env_top::type_id::create("env", this); endfunction endclass如何修改
最新发布
12-17
### AMBA AHB 总线矩阵设计与实现 AMBA (Advanced Microcontroller Bus Architecture) 是 ARM 公司定义的一种开放标准总线架构,用于连接和管理片上系统(SoC)中的多个组件。AHB (Advanced High-performance Bus) 则是 AMBA 中针对高性能应用而优化的一部分。 #### 设计原则 在设计 AHB 总线矩阵时,需考虑以下几个方面: - **多主设备支持**:为了提高系统的灵活性和支持更复杂的 SoC 架构,AHB 矩阵允许多个主控器同时访问不同的外设[^1]。 - **仲裁机制**:当多个主控器请求同一时刻访问相同从属模块时,需要有效的仲裁策略来决定哪个请求优先得到服务。常见的仲裁算法有轮询(round-robin),固定优先级(fixed priority)。 - **数据宽度适配**:不同主/从端口可能具有不同的数据位宽,在传输过程中要确保能够正确处理这些差异并保持性能最优[^2]。 #### 实现要点 以下是构建高效可靠的 AHB 总线交换结构的一些关键技术点: - **地址解码逻辑**:负责识别各个事务的目标地址范围,并将其路由到相应的从站接口。这通常涉及到配置寄存器设置以及内部状态机控制电路的设计。 - **缓冲区管理**:为了避免由于速度不匹配造成的瓶颈现象,可以在各条路径之间加入适当大小的数据缓存队列;此外还需注意防止死锁的发生。 - **同步与时钟域跨越**:考虑到现代 SOC 可能存在多种频率的操作单元共存的情况,因此必须妥善解决跨时钟边界的信号传递问题,比如采用握手协议或者双稳态触发器等方法。 ```verilog // Verilog 伪代码展示简单的 AHB 路由选择功能 module ahb_router ( input wire hclk, input wire hresetn, // Master interface signals... output reg [31:0] hrdata, // Read data from slave to master ... ); always @(posedge hclk or negedge hresetn) begin : proc_hrdata if (!hresetn) hrdata <= &#39;bz; else case ({hmastlock,htrans}) 2&#39;b00: /* IDLE */ hrdata <= &#39;bz; 2&#39;b01: /* BUSY */ hrdata <= slv_data_reg; // Assume this comes from some internal register connected to slaves. default hrdata <= &#39;bx; endcase end endmodule ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starry丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值