verilog 可变范围的bit选择

要完成16byte中byte的合并:

首先verilog 不支持可变范围的bit选择,所以下面两种写法,lint 都会报错:

复制代码
// write style 1
always (*)begin
  map_wdata ='b0;
  map_wdata[127:lower_byte_addr*8]= wdata[127:lower_byte_addr*8];
  map_wdata[(lower_byte_addr-1)*8+:8]= wone_size ? wone_data_store:wdata[(lower_byte_addr-1)*8+:8];
  map_wdata[(lower_byte_addr-1)*8-1:0]= wdata[(lower_byte_addr-1)*8-1:0];
end
// write style 2
assign map_wdata = wone_size ? {wdata[127:lower_byte_addr*8],wone_data_store,wdata[(lower_byte_addr-1)*8-1:0]}:wdata;

正确的写法是下面的,将可变范围变成按byte进行选择:

复制代码
// write style 3
always @(*)begin
  if(wone_size)
    for(i=0; i<STRB_WIDTH;i=i+1)begin 
      if(i==lower_byte_addr)
        map_wdata[i*8+:8]= wdata[i*8+:8];
      else
        map_wdata[i*8+:8]= wone_data_store;
  end
  else begin
    map_wdata = wdata;
  end
end
相关推荐
云游云记6 分钟前
nesbot/carbon 常用功能总结
linux·运维·服务器
landonVM24 分钟前
Linux 下的高效压缩工具 Zstandard
linux·运维·服务器
遇见火星26 分钟前
服务器运维操作命令速查手册
运维·服务器
chengrise34 分钟前
Oracle EBS 成本异常排查全指南:差异分摊、成本回滚场景与解决方案
运维·数据库·oracle·erp·ebs
EmbedLinX38 分钟前
Linux之内存管理
linux·服务器·c语言·c++
2301_7925800041 分钟前
xuepso
java·服务器·前端
Nightwish51 小时前
Linux随记(二十八)
linux·运维·服务器
Zach_yuan1 小时前
Socket 编程基础
linux·服务器
女王大人万岁1 小时前
Go标准库 io与os库详解
服务器·开发语言·后端·golang
Madison-No71 小时前
【Linux】文件操作&&重定向原理
android·linux·运维