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

pan*_*hul 2 verilog

我制作了两个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
Run Code Online (Sandbox Code Playgroud)

第二个模块返回第二个出现的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
Run Code Online (Sandbox Code Playgroud)

我在编译期间遇到以下错误.请帮忙.

检查器'findPositionOf_1'未找到.实例化'f1'必须是可见的检查器.发现一个空体的开始/结束块.这在SystemVerilog中是允许的,但在Verilog中是不允许的.请查找任何流浪的分号.

Hid*_*ida 5

顺便说一句,你编写代码似乎并没有完全理解verilog(和其他HDL语言)与"普通",程序,编码的区别.

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

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

我们可以pos通过左移'1 pos位数(1<<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
Run Code Online (Sandbox Code Playgroud)