verilog中的“生成”和“endgenerate”附近的语法错误

verilog中的“生成”和“endgenerate”附近的语法错误

问题描述:

我是Verilog中的新手,我尝试使用verilog实现单精度浮点加法 - 减法。我收到了一个我无法纠正的错误。谁能帮帮我吗?verilog中的“生成”和“endgenerate”附近的语法错误

module addModule(Rs,Re,Rm,As,Ae,Am,Bs,Be,Bm);

//Declarations of ports 
    Rs,Re,Rm; 
    As,Bs; 
    input [7:0] Ae,Be; 
    input [22:0] Am,Bm; 

reg [7:0] Re; 
reg [22:0] Rm; 
reg Rs; 
//wire declarations. 
wire [23:-1] C; 
assign C[-1] = 0; 
wire [23:1] sum; 
//variable declaration. 
genvar count; 

always @(*) 
begin 
//Add two mantissas. 
if ((As^Bs)==0) 
    begin 
     generate //getting error here "Syntax error near "generate"." 
     for(count=0;count<24;count=count+1) 
      begin 
       add add_1(.c_out(C[count]),.sum(sum[count]),.in1(tempAm[count]),.in2(tempBm[count]),.c_in(C[count-1])); 
      end 
     endgenerate //syntax error near "endgenerate" 
    end 

else 
    begin 
     generate //Syntax error near "generate". 
     for(count=0;count<24;count=count+1) 
      begin 
       subtract sub_1(.c_out(C[count]),.dif(sum[count]),.in1(tempAm[count]),.in2(tempBm[count]),.c_in(C[count])); 
      end 
     endgenerate //Syntax error near "endgenerate". 
    end 


end 
endmodule 

在此先感谢。 :)

+0

实例(即'减去sub_1')不会进入'always'或'initial'块 – Morgan

在Verilog的,当你实例一个模块,这意味着你要添加额外的硬件板。

在模拟开始前(即在编译时)必须添加此硬件。在这里,您可以在每个时钟脉冲上添加/删除硬件,而不是而不是

一旦实例化,模块将被执行/检查每个时间戳的模拟,直到结束。

所以要执行任何模块,只需实例化它,提供clk和其他所需的输入,并且将always块添加到子模块本身中。

一旦硬件是实例,应当根据用于整个寿命它里面的逻辑,来执行。

在这里你正在实例化模块错误的地方。使用generate块必须完成以外的任何程序块。

// generate outside any other blocks 
    generate 
    for(count=0;count<24;count=count+1) 
     begin 
      add add_1(.c_out(C[count]),.sum(sum[count]),.in1(tempAm[count]),.in2(tempBm[count]),.c_in(C[count-1])); 
     end 
    endgenerate 

always @(*) 
begin 
// Other stuff here. 
end 

如果你想处理输入信号subtract sub_1模块的,只需操纵CsumaddModule模块声明的其他变量。由于它们连接,所以的变化也反映在subtract sub_1模块中的

有关生成块的更多信息,请参阅Module InstantiationGenerate block examplesimilar question链接。

+0

我想调用add模块或减去模块,具体取决于if块是否满足条件。我尝试在两个任务中定义生成块,一个用于调用add模块,另一个用于调用总是在@(*)之上的减法模块,并在if else块中调用任务,但它仍然不工作。 –

+2

@vishnupriya你不** ** CALL **模块** **实例化**它们。你描述的硬件不写软件。您必须使添加和减去始终存在,然后选择要使用哪一个的输出。 – Morgan

+2

模块在仿真开始时被实例化一次。正如Morgan所指出的,模块代表物理硬件,而任务和功能则用于计算重复代码。在你的情况下,可以有一个解决方法来添加一个信号/线作为输入到每个模块'add'和'subtract'。只有当控制线的值变高时才执行操作。例如。当“As^Bs = 1”并且执行加法时,导线变为高电平状态。同时给“sub1”模块倒相。还可以有其他的逻辑。然而在任何情况下,生成块都需要在程序块之外。 – sharvil111