Modelsim中的编译和quartus中的编译有什么不同
时间:10-02
整理:3721RD
点击:
再quartus中编译完全成功,但是再modelsim中编译却出错:Error: D:/1Myproject/Counter4/RTL/Counter4.v(41): Undefined variable: WIDTH.
** Error: D:/1Myproject/Counter4/RTL/Counter4.v(50): 'WIDTH' already declared in this scope.
** Error: D:/1Myproject/Counter4/RTL/Counter4.v(30): Identifier must be declared with a port mode: dout.
我定义了width的,modelsim中的编译和quartus中编译有什么不同点啊,谢谢
源代码如下
module Counter4(
//input
sys_clk,
sys_rst_n,
ena,
//output
dout,
cout
);
//input ports
input sys_clk; //system clock;
input sys_rst_n; //system reset, low is active;
input ena; //
//output ports
output [WIDTH-1:0] dout;
output cout;
//reg define
reg [WIDTH-1:0] counter;
//wire define
//parameter define
parameter WIDTH = 4;
/*******************************************************************************************************
** Main Program
**
********************************************************************************************************/
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n ==1'b0) begin
counter <= 1'b0;
end
else if (ena == 1'b1) begin
counter <= counter + 1'b1;
end
end
assign cout = &counter;
assign dout = counter;
endmodule
//end of RTL code
** Error: D:/1Myproject/Counter4/RTL/Counter4.v(50): 'WIDTH' already declared in this scope.
** Error: D:/1Myproject/Counter4/RTL/Counter4.v(30): Identifier must be declared with a port mode: dout.
我定义了width的,modelsim中的编译和quartus中编译有什么不同点啊,谢谢
源代码如下
module Counter4(
//input
sys_clk,
sys_rst_n,
ena,
//output
dout,
cout
);
//input ports
input sys_clk; //system clock;
input sys_rst_n; //system reset, low is active;
input ena; //
//output ports
output [WIDTH-1:0] dout;
output cout;
//reg define
reg [WIDTH-1:0] counter;
//wire define
//parameter define
parameter WIDTH = 4;
/*******************************************************************************************************
** Main Program
**
********************************************************************************************************/
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n ==1'b0) begin
counter <= 1'b0;
end
else if (ena == 1'b1) begin
counter <= counter + 1'b1;
end
end
assign cout = &counter;
assign dout = counter;
endmodule
//end of RTL code
每一个编译器其对于语法的理解都不太一样,所以特别在编译的时候,有的规则宽松,有的严格。modelsim就属于比较严格的。modelsim要求一个变量在使用之前一定要经过声明,你这里parameter WIDTH的声明,在使用之后,你在前面的output [WIDTH-1:0]里面已经用过width这个变量了。
先用WIDTH后面才定义,怎么行呢
modelsim在RTL编译时,语法检查比较严格。
一个变量在使用前就要定义和声明,这样就都能编译过了
