【问题标题】:109 bit tree comparator with generate and for loop具有生成和 for 循环的 109 位树比较器
【发布时间】:2017-07-24 23:59:29
【问题描述】:

我正在尝试为 109 位树比较器编写 Verilog 代码,但我仍然是生成循环的新手。

到目前为止,我已经编写了一些代码,但出现了一些错误。另外,我不确定是否可以将二维数组用于 g 和 l 信号?

parameter NUM_OF_BITS = 109;
parameter NUM_OF_LEVELS = 7;
genvar i;

for (x=0; x<NUM_OF_LEVELS; x=x+1) begin:
    generate for (i=0; i<NUM_OF_BITS/((2*x)+1); i=i+1) begin: MCs
        mag_comp2_1 mc (in0[2*i+1:2*i],in1[2*i+1:2*i],g[x][i],l[x][i]);
    end
    endgenerate
    NUM_OF_BITS = NUM_OF_BITS/2;
end

【问题讨论】:

  • i) 告诉我们错误是什么会对我们有所帮助。 ii) generate 语句的格式在 IEEE 1364-2001 和 IEEE 1364-2005 之间发生了变化。您似乎在两者之间有一种奇怪的混合语法。把generateendgenerate放在外面怎么样?
  • iii) x 也必须是 genvar。 iv) 我希望您需要静态地 计算NUM_OF_BITS,换句话说,我希望您必须删除NUM_OF_BITS = NUM_OF_BITS/2; 行,而是计算for 语句中的内部循环限制。
  • 你在使用system verilog吗?在这种情况下,第一个 for 循环已经是一个生成块。生成块内的generate 关键字可能是一个问题。去掉它。如果您使用的是普通的verilog,仍然从它所在的位置删除generate,并将它放在整个循环结构周围。如果您愿意,您也可以在系统 verilog 中执行此操作。
  • @MatthewTaylor 我不明白生成外部 for 循环的需要。外部 for 循环仅用于关卡,据我所知,生成块用于为我用于 2:1 幅度比较器的模块生成实例。谁能解释一下?
  • @Serge 我使用的是verilog而不是系统verilog。你能解释一下我是否需要为外部 for 循环生成密钥。我不能在另一个循环中生成一个 for 循环吗?

标签: for-loop verilog comparator


【解决方案1】:

为什么不在 for 块中定义互连?这样你会更方便。

一个不完整的例子:

parameter NUM_OF_BITS = 220;
parameter NUM_OF_LEVELS = 7;
genvar i,x;

generate for (x=1; x<NUM_OF_LEVELS; x=x+1) 
begin: Ls
    wire [NUM_OF_BITS/(2**x)-1:0] output1;
    wire [NUM_OF_BITS/(2**x)-1:0] output2;
    for (i=0; i<NUM_OF_BITS/(2**x); i=i+1) 
    begin: MCs
        if (x == 1) 
        begin
            // for the first level connect inputs to the module
            mag_comp2_1 mc (input1[2*i+1:2*i],input2[2*i+1:2*i],output1[i],output2[i]);
        end
        else 
        begin
            // for other levels connect ouputs of the previous level
            mag_comp2_1 mc (Ls[x-1].output1[2*i+1:2*i],Ls[x-1].output2]2[2*i+1:2*i],output1[i],output2[i]);
        end              
    end
end
endgenerate

【讨论】:

  • 谢谢,Alper 我为代码制作了一个新版本,没有任何条件检查(我相信这会更有效,请告诉我是否错了)。
【解决方案2】:

您需要以下内容。 generate .. endgenerate 告诉编译器展开关键字之间的所有循环和条件语句。因此,您最终会得到很多模块 ma​​g_comp2_1

的实例
parameter NUM_OF_BITS = 109;
parameter NUM_OF_LEVELS = 7;
genvar i, x;

generate
  for (x=0; x<NUM_OF_LEVELS; x=x+1) begin: externloop
    for (i=0; i<NUM_OF_BITS/((2*x)+1); i=i+1) begin: MCs
        mag_comp2_1 mc (in0[2*i+1:2*i],in1[2*i+1:2*i],g[x][i],l[x][i]);
    end
   //NUM_OF_BITS = NUM_OF_BITS/2;
  end
endgenerate

【讨论】:

  • 我更新了代码,请问您是否正确?
  • 我收到g is not a memory & l is not a memory 的错误
  • @AshutoshJain 我已回滚您的编辑以将代码返回到原始问题中的代码。 Stack Overflow 的想法是问题成为未来谷歌员工的有用资源。通过如此多地改变你的问题,答案和 cmets 毫无意义。您关于lg 不是记忆的错误是一个完全不同的问题。请再问一个问题,我或其他人会很乐意回答。
  • @AshutoshJain 无论如何,gl 都必须声明。在您的案例中,您将它们用作二维数组。您的示例中没有提供定义。因此,如果不为您重新发明整个算法,就很难对它们发表评论。
【解决方案3】:
parameter NUM_OF_BITS = 220;
parameter NUM_OF_LEVELS = 7;
genvar x,i;

wire [NUM_OF_LEVELS:0][NUM_OF_BITS:0] g, l;

assign g[0] = in0;
assign l[0] = in1;

generate for (x=1; x<NUM_OF_LEVELS; x=x+1) begin: Ls
    for (i=0; i<NUM_OF_BITS/(2**x); i=i+1) begin: MCs
        mag_comp2_1 mc (g[x-1][2*i+1:2*i],l[x-1][2*i+1:2*i],g[x][i],l[x][i]);
    end
end
endgenerate

assign gt = g[NUM_OF_LEVELS][0];
assign lt = l[NUM_OF_LEVELS][0];

【讨论】:

  • @MatthewTaylor 请验证此版本的代码。
  • @AlperKucukkomurler 请验证此版本的代码。
猜你喜欢
  • 1970-01-01
  • 2017-01-23
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2018-11-30
  • 2015-01-25
相关资源
最近更新 更多