Interleaving String - LeetCode

交错字符串动态规划
本文介绍了一种使用动态规划解决LeetCode上的Interleaving String问题的方法。该问题要求判断字符串s3是否能通过交替插入字符串s1和s2的字符形成。文章详细解释了动态规划的思路,并提供了一个高效的C++实现。

Interleaving String - LeetCode

题目
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = “aabcc”,
s2 = “dbbca”,

When s3 = “aadbbcbcac”, return true.
When s3 = “aadbbbaccc”, return false.


动态规划的题目
想法是用一个数组a[k][i][j]记录s3的前k个字符能否由s1的前i个字符s2的前j个字符插成
注意这里可以降低一个维度,因为i+j=k,所以用a[k][i]就够了。

递推关系式
a[k][i] = (a[k-1][i-1]&&s1[i-1]==s3[k-1]) || (a[k-1][i]&&s2[k-i-1]==s3[k-1])

注意这里推导a[k][i]只用了a[k-1][i]a[k-1][i-1](上面一格与左上一格),所以如果我们在计算时按从右往左顺序,就可以再降低一个维度。

上代码

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int l1,l2,l3;
        l1 = s1.length();
        l2 = s2.length();
        l3 = s3.length();
        if (l3 != l1+l2) return false;

        vector<bool> dp(l1+1, false);
        dp[0] = true;
        for (int i = 1; i <= l3; i++) {
            int t = min(l1, i);
            for (int j = t; j >= 0; j--) {
                bool a = false, b = false;
                if (dp[j] == 1 && s2[i-j-1] == s3[i-1]) a = true;
                if (j > 0 && dp[j-1] == 1 && s1[j-1] == s3[i-1]) b = true;
                dp[j] = a || b;

            }
        }
        return dp[l1];
    }
};
<think>嗯,用户这次的问题是关于AXI协议中的OSD机制,具体是interleaving和out-of-order的理解与验证方法。从对话历史看,用户之前关注过MMU验证难点,现在转向总线协议层面,可能是SoC验证工程师或数字IC设计人员,需要深入理解AXI高级特性。 用户引用的三段材料很有价值:第一段说明乱序的本质是命令与数据响应顺序解耦;第二段指出交织比乱序更复杂且AXI4已移除写交织;第三段展示实际芯片配置案例。这些恰好构成理论-限制-实践的知识链。 关于out-of-order机制,核心在于解耦命令顺序与数据响应顺序。比如master先发A请求后发B请求,slave可以先返回B数据再返回A数据,通过ID标签区分归属。这能有效提升总线利用率,但验证时需重点检查ID匹配和顺序约束(如同ID顺序不变)。 interleaving机制更激进,它允许单个ID的数据包被打断插入其他ID数据。引用[2]提到AXI4仅保留读交织且实际支持有限,因为交织需要复杂的调度逻辑。验证时特别要注意数据包边界是否被破坏,以及中断后能否正确恢复上下文。 验证方法上,建议分层实施:基础功能测试定向用例覆盖握手协议;随机测试用约束随机生成ID序列和传输间隔;压力测试制造背靠背请求和极端延迟场景。覆盖率要监控ID组合、包长变化点、缓冲水位等关键节点。 用户可能隐含的需求是如何平衡验证完备性与复杂度。引用[2]提到支持这些特性会让代码量激增,实际项目需评估必要性。可以补充说明:简单外设通常固定ID实现顺序传输,而DMA等高性能模块才需要完整OSD支持。 最后生成的问题延伸了OSD的应用场景和调试技巧,这些都是验证工程师日常遇到的痛点。特别是问题3关于波形分析技巧,实际调试中定位乱序问题往往耗费大量时间。</think>以下是针对 AXI OSD(Out-of-Order, Interleaving)机制及其验证方法的系统解析: --- ### **一、核心机制解析** #### 1. **Out-of-Order (乱序传输)** - **本质**:解耦命令与数据响应的顺序关系 - 发送端顺序:Master 依次发送命令 A、B - 响应端顺序:Slave 可先返回 B 的数据,再返回 A 的数据 - **依赖 ID 标识**: 通过 `AWID/ARID` 区分不同事务(Transaction),同 ID 的数据必须按顺序传输,不同 ID 的数据可乱序[^1]。 ```verilog // 示例:两个不同 ID 的写事务 send_cmd(A, ID=1); // 先发送命令 A send_cmd(B, ID=2); // 再发送命令 B // Slave 可能返回: send_data(B, ID=2); // 先返回 B 的数据 send_data(A, ID=1); // 再返回 A 的数据 ``` #### 2. **Interleaving (交织传输)** - **本质**:单事务内数据包可被其他事务中断插入 - 例如:ID=1 的 Burst 传输过程中,插入 ID=2 的单拍数据 - **AXI4 限制**: - **仅读操作支持交织**(AXI4 移除写交织)[^2] - 需 Master/Slave 明确支持该特性 #### 3. **性能与复杂度权衡** | **机制** | 性能增益 | 实现复杂度 | 典型应用场景 | |------------------|------------------------|--------------------------------|----------------------| | Out-of-Order | 高(减少总线空闲) | 中等(需 ID 管理) | DMA、多核访问 | | Interleaving | 极高(消除气泡周期) | 高(需数据包拆解与重组) | 高带宽读操作 | > 💡 **关键设计约束**: > - Interleaving 要求 Slave 具备多事务并发处理能力 > - 乱序需保证同 ID 数据顺序性(`WSTRB` 对齐等)[^2] --- ### **二、验证方法** #### 1. **定向测试(Corner Cases)** - **乱序场景**: - 同 ID 乱序尝试 → 检测是否被阻止 - 不同 ID 数据返回顺序逆序 → 检查数据一致性 - **交织场景**: - 突发传输中插入高优先级事务 → 验证包完整性 - 背靠背(Back-to-Back)交织请求 → 检查时序冲突 #### 2. **随机约束测试** ```systemverilog class axi_transaction; rand bit [3:0] id; // 随机 ID rand int delay; // 请求间延迟 constraint valid_delay { delay inside {[0:5]}; } endclass // 生成乱序序列 task generate_oo_order; axi_transaction tr1, tr2; tr1 = new(); tr1.randomize(); tr2 = new(); tr2.randomize(); send(tr1); #tr1.delay send(tr2); // 可变延迟注入 endtask ``` #### 3. **覆盖率模型** | **覆盖点类型** | 监测目标 | 示例指标 | |--------------------|-----------------------------------|------------------------------| | **事务顺序** | 命令/响应顺序组合 | 不同 ID 响应逆序比例 | | **交织深度** | 单事务被中断次数 | Burst 长度 vs 中断次数 | | **边界条件** | FIFO 满/空、超时 | Buffer 溢出触发率 | #### 4. **断言检查(SVA)** ```systemverilog // 同 ID 数据顺序性断言 property data_order; @(posedge clk) (valid && (id == prev_id)) |-> (data_seq == prev_seq + 1); endproperty ``` #### 5. **硬件加速验证** - 使用 FPGA 原型或 Emulator 进行长序列压力测试 - 注入极端场景: - 100% 总线利用率下的乱序 - 最大支持 ID 数并发请求 --- ### **三、调试与优化建议** 1. **波形分析重点**: - 关注 `ID` 标签与 `LAST` 信号匹配性 - 检查交织场景下 `ARLEN` 与实际数据包长度 2. **性能瓶颈定位**: - 统计总线空闲周期(Idle Cycles) - 分析交织中断导致的重新仲裁开销 3. **面积优化**: - 非高性能场景可关闭 Interleaving 以节省逻辑[^2] --- ### **四、工程实践参考** 在 Exynos 4 芯片中,通过 MIU(Memory Interconnect Unit)配置交织参数: ```c // 引用自 Linux 内核源码[^3] writel(APB_SFR_INTERLEAVE_CONF_VAL, EXYNOS4_MIU_BASE + APB_SFR_INTERLEAVE_CONF_OFFSET); ``` 此处 `Interleave_bit0` 和 `Interleave_bit1` 控制地址交织策略,需与 DDR 控制器配置匹配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值