【发布时间】:2019-07-13 23:06:47
【问题描述】:
我想将每个位扩展 n 次。 例如,
// n = 2
5'b10101 -> 10'b1100110011
// n = 3
5'b10101 -> 15'b111000111000111
在 Verilog 或 SystemVerilog 中有没有简单的方法(即不使用生成块)?
编辑 19.02.21
其实我是在做 64 位掩码到 512 位掩码的转换,但它与 {8{something}} 不同。我当前的代码如下:
logic [63 : 0] x;
logic [511 : 0] y;
genvar i;
for (i = 0; i < 64; i = i + 1) begin
always_comb begin
y[(i + 1) * 8 - 1 : i * 8] = x[i] ? 8'hFF : 8'h00;
end
end
我只是想知道还有更多“美丽”的方式。
【问题讨论】:
-
不,verilog 中没有办法以简单的方式做到这一点。尽管您可能会使用重复运算符来执行重复组,例如
{2'b11, {2{4'b0011}}} -
@Serge 谢谢你的回复。实际上,我需要这个功能来将位掩码转换为字节掩码。例如,
3'b010 -> 24'h00FF00我问,您似乎是 verilog 专家,有什么“推荐”的方法吗?目前,我正在使用生成块来迭代每一位。 -
您需要提供代码示例。它可能是特定于您的代码的解决方案。
function很可能会这样做。 -
如果你从一个字节到另一个字节,我认为你的'n'总是8。那么你可以使用
{8{your_bit}} -
在 Verilog 中处理位宽时,如果您知道 N 是常数以及表达式中的操作数,则有不同的方法。