我制作了两个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中是不允许的。请 寻找任何流浪的分号。
答案 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