【问题标题】:Verilog Module Instantiation and empty begin endVerilog 模块实例化和空开始结束
【发布时间】:2016-10-20 05:41:10
【问题描述】:

我制作了两个verilog 模块。第一个采用 9 位数字并返回 1 在其中第一次出现的位置。

module findPositionOf_1(
  input [8:0] data,
  output reg [3:0] position
  );


  always @(data)
  begin
    if(data==9'b0000_00000)
      position=4'b0000;
    else if(data[0]==1)
      position=4'b0000;
    else if(data[1]==1)
      position=4'b0001;
    else if(data[2]==1)
      position=4'b0010;
    else if(data[3]==1)
      position=4'b0011;
    else if(data[4]==1)
      position=4'b0100;
    else if(data[5]==1)
      position=4'b0101;
    else if(data[6]==1)
      position=4'b0110;
    else if(data[7]==1)
      position=4'b0111;
    else if(data[8]==1)
      position=4'b1000;
  end    

endmodule

第二个模块返回第二次出现的 1。它调用第一个模块首先将该位更改为零,然后再次找到 1 的出现。

module findPositionOf_2nd_1(
  input [8:0] r1_data, 
  output [3:0] position1 
);

reg [3:0] pos,pos2; 
reg [8:0] temp;

integer i;
always @(r1_data)
begin
  findPositionOf_1 f1(.data(r1_data), .position(pos));


  i=pos;
  temp=r1_data;
  temp[i]=0;
  findPositionOf_1 f2(temp,pos2);
  if(pos2==4'b0000)
    position1=0;
  else
    position1=pos2;

end

endmodule

我在编译过程中遇到以下错误。请帮忙。

未找到检查器“findPositionOf_1”。实例化 'f1' 必须是 可见的检查器。 发现一个带有空主体的开始/结束块。这 在 SystemVerilog 中是允许的,但在 Verilog 中是不允许的。请 寻找任何杂散的分号。

【问题讨论】:

    标签: verilog


    【解决方案1】:

    通过您编写代码的方式,您似乎还没有完全掌握 verilog(和其他 HDL 语言)与“正常”、程序化、编码的不同之处。

    您似乎假设always@ 块中的所有内容都将从上到下执行,并且模块类似于函数。不是这种情况。在设计模块时,您需要考虑您期望硬件的外观。

    在这种情况下,您知道您需要两个 findPositionOf_1 模块。您知道您希望第一个 (u_f1) 的结果影响第二个 (u_f2) 的输入。为此,请实例化两个模块,然后确定它们之间的互连。

    我们可以通过左移'1pos 次数(1<<pos)来创建一个位置为pos 的向量。通过对这些位进行异或运算,r1_data ^ 1<<pos 语句将删除不需要的 1。

    module findPositionOf_2nd_1(input [8:0] r1_data, output [3:0] position1 );
    wire [3:0] pos,pos2; 
    wire [8:0] temp;
    
      findPositionOf_1 u_f1(.data(r1_data), .position(pos));
      findPositionOf_1 u_f2(.data(temp), .position(pos2));
    
      assign temp = r1_data ^ (1<<pos);
      assign position1 = pos2;
    
    endmodule
    

    【讨论】:

    • 为什么实例化不能发生在 always 块中。我对 verilog 很陌生。
    【解决方案2】:

    您已经在一个始终块内实例化了您的模块,该块是一个程序块,在语法上是不正确的。其次,您将第一个模块用作函数调用,这是不允许的。如前所述,您需要有一个单独的测试平台,您可以在其中连接两个模块并进行检查。将第一个出现的位置作为 findPositionOf_2nd_1 模块的输入。对于您的问题,也许这应该有所帮助

    Why can't I instantiate inside the procedural block in Verilog

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多