如何为模块实例化忽略一个或多个输出总线引脚

问题描述 投票:0回答:2

我想忽略SystemVerilog中模块的数组参数中的一个或多个位。

module x(in a, out [0:3] z);
...
endmodule

module tb;
  logic my_a;
  logic [1:3] my_z;
  // I want to stop having to do this next line:
  logic ignore_this_bit;
  x myx(.a(my_a), .z({ignore_this_bit, my_z}));
endmodule

执行此操作的正确语法是什么?我一直在使用ignore_this_bit声明来执行上述操作,并且从未连接到该网络。但是似乎应该有一个更简单的方法。诸如只在模块实例化的参数中使用逗号而不使用变量名之类的东西,或者可能使用诸如1'bX之类的东西代替输出参数位之类的东西。

这是否受到我在这里对向量使用大端位排序的事实的影响? (我讨厌它,但是我正在为使用该顺序的旧CPU构建代码,将代码与现有代码进行匹配比修复它更容易。)

这是一个很难找到的概念,我已经尝试过。有谁能帮助我知道如何“正确地进行”操作的专业知识?谢谢。

syntax system-verilog
2个回答
1
投票

您不需要在这里做任何事情。这应该可以截断MSB z [0]

x myx(.a(my_a), .z(my_z));

将输出端口视为隐式连续分配

assign my_z = myx.z;

但是如果您不想忽略MSB,没有简单的解决方案。您可能需要查看网络alias功能。


0
投票

verilog中没有特殊方法可以忽略输出的位。因此,将concat与不需要的变量一起使用的方法是完成此操作的好方法({ignore_this_bit, my_z})。出于可读性原因,此变量的命名很重要。

不受范围描述顺序的影响。您似乎正在忽略最左边的位。无论您如何描述范围,位总是以相同的方式排序:

bits:   0011
[3:0]:  3  0
[0:3]:  0  3
concat: {ign, 0, 1, 1};

另一种方法是使用足够大的变量以连接到输出,然后使用其位:

logic [1:3] my_z;
logic [0:3] their_z;
 x myx(.a(my_a), .z(their_z));
 assign my_z = their_z[1:3];
© www.soinside.com 2019 - 2024. All rights reserved.