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

时间:2016-10-20 05:41:10

标签: 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

第二个模块返回第二个出现的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'必须是a   可见的检查器。   发现一个空体的开始/结束块。这个   在SystemVerilog中是允许的,但在Verilog中是不允许的。请   寻找任何流浪的分号。

2 个答案:

答案 0 :(得分:5)

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

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

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

我们可以通过左移pos '1次数(pos)创建一个位置为1<<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

答案 1 :(得分:1)

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

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