Verilog 平方根除法中的位分组

Verilog 平方根除法中的位分组,verilog,root,square-root,Verilog,Root,Square Root,我已经为参数化的数字的平方根编写了verilog代码。如果位数为偶数,则代码可以工作 如果位数为奇数,则代码将位数从右LSB开始分成两组。第一次迭代将选择从最左边的位开始有1位的组 我正在使用计数器进行所需的循环次数。我不明白我应该如何为第一次迭代选择1位的组,为其余的迭代选择2位的组 可变位数的位选择在硬件中似乎并不实用。如果您展示了一些代码,那么答案可能更相关或更实用 解决此问题的两种方法: 在检测到奇数时填充该数字,并将MSB添加为0 在迭代中有一个if-else,它选择1或2位选择性地填

我已经为参数化的数字的平方根编写了verilog代码。如果位数为偶数,则代码可以工作

如果位数为奇数,则代码将位数从右LSB开始分成两组。第一次迭代将选择从最左边的位开始有1位的组


我正在使用计数器进行所需的循环次数。我不明白我应该如何为第一次迭代选择1位的组,为其余的迭代选择2位的组

可变位数的位选择在硬件中似乎并不实用。如果您展示了一些代码,那么答案可能更相关或更实用

解决此问题的两种方法:

在检测到奇数时填充该数字,并将MSB添加为0

在迭代中有一个if-else,它选择1或2位选择性地填充LSB

1的代码示例

代码示例2

这应该能够静态展开,因为奇数是基于参数的,循环有固定的迭代次数。如果循环可以静态展开,那么它是可合成的

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
// 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