【问题标题】:Verilog: bit slice vector twiceVerilog:位切片向量两次
【发布时间】:2017-12-14 12:58:12
【问题描述】:

假设我们有一个 128 位的寄存器:

reg [127:0] line;

而我们先从中选出一个32位的字,再从这个字中选出字节,均使用切片:

word = line[(127-32*byte_addr[3:2])-:32];
byte = word[7:0];

效果很好。但是,如果我不想将两个运算符组合在同一行中,似乎是不允许的。

mybyte = line[(127-32*byte_addr[3:2])-:32][7:0]; //all the hell breaks loose

很遗憾,我在 SV 3.1a 规范中找不到明确的规则来禁止这一点。

【问题讨论】:

  • 您遇到的错误究竟是什么?您正在使用哪些工具?
  • "语法错误。令牌是 '['" VCS。
  • 错误是正确的。由于line 被声明为一维数组,因此您只能在其上使用单个索引选择器。
  • 不是切片的结果是向量,也可以切片?那么,基本上,slice 算子不组成,line[][] 被解释为多维访问,会产生错误?
  • SystemVerilog 3.1a 规范已过时。看我的回答

标签: verilog system-verilog


【解决方案1】:

请删除您的 SystemVerilog 3.1a 规范并获取free copy of the 1800-2012 LRM

11.4.12 节中描述的连接运算符可以满足您的需求。

mybyte = {line[(127-32*byte_addr[3:2])-:32]}[7:0];

【讨论】:

    【解决方案2】:

    1800-2012 LRM 说 (7.4.6)

    表达式可以选择压缩数组的一部分,或者任何整数类型, 假定编号为 0。

    术语部分选择是指 选择一维的一个或多个连续位 打包数组。

    没有提及部分选择的部分选择,这是您尝试做的。

    你能让line多维吗?类似的东西

    reg [3:0][7:0] line [3:0];
    

    这将使索引变得微不足道。

    【讨论】:

    • 感谢规范参考。不,不幸的是在这种情况下我不能。或者有没有办法将多维数组“解切片”/打包成 128 位 reg?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多