我已经为一个参数化的数字的平方根编写了verilog代码。如果位数是偶数代码工作。
如果位数是奇数,则代码将位数从右侧开始分成两组(LSB)。第一次迭代将选择从最左边的位开始有1位的组。
我正在使用计数器来完成所需的循环次数。我不明白我应该如何为第一次迭代选择1位组,为其余迭代选择2位。
答案 0 :(得分:0)
可变数量的位选择似乎在硬件中不实用。如果您展示了一些代码,那么答案可能会更具相关性或实用性。
解决这个问题的两种方法:
在检测到奇数时填充数字,将MSB加0。
在迭代中有if else
,选择1或2位选择性地填充LSB。
1的代码示例。
parameter DATA_W = 11;
parameter odd = DATA_W % 2;
input [DATA_W-1:0] data;
reg [DATA_W-1+odd:0] data_int;
always @* begin
if (odd)
data_int = {1'b0, data};
else
data_int = data;
end
2的代码示例。
// Iteration for( loop=0; loop<max; loop=loop+1) begin
if ((loop == 0) && (odd)) begin
sel = {data[0], 1'b0};
end
else begin
sel = data[loop*2+1:loop*2];
end
// end
这应该能够静态展开,因为odd
基于参数并且循环具有固定数量的迭代。如果循环可以静态展开,那么它是可合成的。