Verilog 模块实例化和空开始结束

Verilog Module Instantiation and empty begin end

我制作了两个verilog模块。第一个取一个九位数字和returns其中第一次出现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

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

Checker 'findPositionOf_1' not found. Instantiation 'f1' must be of a visible checker. A begin/end block was found with an empty body. This is permitted in SystemVerilog, but not permitted in Verilog. Please look for any stray semicolons.

从您编写代码的方式来看,您似乎还没有完全掌握 verilog(和其他 HDL 语言)与 "normal"、程序、编码的不同之处。

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

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

我们可以通过左移 '1 pos 次 (1<<pos) 来创建一个在位置 pos 上有 1 的向量。通过将这些位异或在一起,语句 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 块中实例化了您的模块,这是一个程序块,这在语法上是不正确的。其次,您已将第一个模块用作函数调用,这是不允许的。如前所述,您需要有一个单独的测试台,您可以在其中连接两个模块并进行检查。将第一个出现的位置作为 findPositionOf_2nd_1 模块的输入。对于你的问题,也许这应该有所帮助

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