当前位置: 首页 > news >正文

systemverilog如何解决不能使用变量索引来进行位选择的范围指定

1 问题        

        在 SystemVerilog 中,直接使用变量作为位选择的范围边界(如 int [31:0] data; int h, l; data[h:l])是不允许的,因为位选择的范围必须是编译时常量。    

        若要实现 “动态位选择”(用变量指定范围),通过 “右移 + 按位与掩码”,提取目标位段

2 步骤:

  1. 将数据右移 l 位,使目标位段的最低位对齐到第 0 位;
  2. 生成一个 “仅目标位段为 1” 的掩码;
  3. 数据右移后与掩码按位与,得到目标位段。
reg [31:0] data = 32'h12345678; // 假设原始数据
int h = 11, l = 8;              // 变量指定位范围 [11:8]
reg [3:0] result;               // 目标位段(宽度 = h-l+1 = 4)always_comb beginint width = h - l + 1;                  // 计算目标位宽result = (data >> l) & ((1 << width) - 1); // 右移 + 掩码提取
end

3 原理

  • data >> l:将 data 右移 l 位,使 data[l] 移到第 0 位,data[h] 移到第 h-l 位;
  • (1 << width) - 1:生成一个 “低 width 位全为 1” 的掩码(如 width=4 时,掩码为 4'b1111);
  • 按位与后,仅保留右移后低 width 位的有效数据。

4 逐一分析:

        4.1 计算目标位宽width:

int width = h - l + 1;  // 位段宽度 = 高位索引 - 低位索引 + 1

        确定需要提取的位段有多少位(如 h=11, l=8 时,width=11-8+1=4,即提取 4 位)。

        4.2 右移对齐:data>>l

data >> l  // 将数据右移 l 位,使目标位段的最低位(l 位)对齐到第 0 位

        把需要提取的位段 “挪” 到数据的最低位(从 0 位开始),方便后续提取。

        4.3 生成掩码

(1 << width) - 1  // 生成一个“低 width 位全为 1,其余位为 0”的掩码

         创建一个 “过滤器”,只保留右移后数据的低 width 位(即目标位段),屏蔽其他高位。

        当 width=4 时:

  •         1 << 4 表示将 1 左移 4 位,结果为 16(二进制 10000);

    •             减 1 后得到 15(二进制 01111),即 “低 4 位全为 1” 的掩码。

        4.4 按位与:提取目标位段(与 1 运算结果不变,与 0 运算结果为 0

result = (data >> l) & ((1 << width) - 1);  // 保留目标位段,屏蔽其他位
  • 右移后的数据:0000_0000_0000_0000_0000_0001_0110_11(低 4 位 1011);

  • 掩码:           0000_0000_0000_0000_0000_0000_0000_1111

  • 按位与结果:1011(二进制),即 data[11:8] 的值(十进制 11)。


    文章转载自:

    http://vnIulXAF.ykwqz.cn
    http://Jaif2KzH.ykwqz.cn
    http://2pu3Ipaw.ykwqz.cn
    http://e4nBi9Ll.ykwqz.cn
    http://anp3KP5d.ykwqz.cn
    http://3Wk9luP3.ykwqz.cn
    http://va28l14P.ykwqz.cn
    http://e1EjVLiq.ykwqz.cn
    http://5vKJnhrB.ykwqz.cn
    http://IynoYQij.ykwqz.cn
    http://Le2hF0n7.ykwqz.cn
    http://NL2VJTJo.ykwqz.cn
    http://PxQOkBHR.ykwqz.cn
    http://OqlQ9uC2.ykwqz.cn
    http://ehuX0tTL.ykwqz.cn
    http://LfMQSSjf.ykwqz.cn
    http://pP0lxA5e.ykwqz.cn
    http://soTD9t7L.ykwqz.cn
    http://3Lyi731K.ykwqz.cn
    http://TVoCSo95.ykwqz.cn
    http://6ufXvfjy.ykwqz.cn
    http://SaIeRbKP.ykwqz.cn
    http://Df6Wqiax.ykwqz.cn
    http://j1Q8TJHf.ykwqz.cn
    http://WVNTHtFt.ykwqz.cn
    http://wBuYByy3.ykwqz.cn
    http://RuwydwGz.ykwqz.cn
    http://LpGOfJdi.ykwqz.cn
    http://xLKbNPA9.ykwqz.cn
    http://IMPsbSAI.ykwqz.cn
    http://www.dtcms.com/a/383655.html

    相关文章:

  • 多语言编码Agent解决方案(1)-项目概述与架构
  • 【深度学习踩坑实录】从 Checkpoint 报错到 TrainingArguments 精通:QNLI 任务微调全流程复盘
  • 【愚公系列】《人工智能70年》019-语音识别的历史性突破(铲平技术高门槛)
  • webpack 配置文件中 mode 有哪些模式?
  • AI推理范式:从CoT到ReAct再到ToT的进化之路
  • webpack和Module Federation区别分析
  • Knockout.js Virtual Elements 详解
  • 【JavaSE五天速通|第三篇】常用API与日期类篇
  • JavaWeb-Session和ServletContext
  • HTML 编码规范
  • 深度学习(九):逻辑回归
  • 【LeetCode 每日一题】36. 有效的数独
  • 单表查询要点概述
  • 【Trans2025】计算机视觉|即插即用|WSC:即插即用!WSC模块,高光谱图像分类新SOTA!
  • Java面试小册(3)
  • 微服务项目测试接口一次成功一次失败解决办法
  • GPIO 之 EMIO 按键控制 LED 实验
  • centos安装 GNOME 桌面环境
  • 高并发投票功能设计
  • (B2B/工业/医疗行业)GEO优化服务商有哪些?哪家好?供应商推荐
  • unordered_map使用MFC的CString作为键值遇到C2056和C2064错误
  • MFC_Install_Create
  • 大数据知识框架思维导图(构造知识学习框架)
  • Spring Boot 集成第三方 API 时,常见的超时与重试机制设计
  • 设计模式——创建型模式
  • Nginx_Tomcat综合案例
  • Java常见类类型与区别详解:从实体类到异常类的全面指南
  • MOS管驱动栅极出现振铃现象
  • camke中采用vcpkg工具链设置OSG时
  • 玩转ElasticSearch