modelsim中'xxx' already declared in this scope (yyy). 错误怎么解决?
但是用modelsim仿真时候,出现'xxx' already declared in this scope (yyy).这样的报警,一般要怎么去解决呢?
出现的错误很多,其中一个如下:
Error: D:/today/modelsimtb/ssram1.v(45): 'clk_125m' already declared in this scope (ssram1).
程序如下(testbench文件未有错误,所以未列出程序,下面只是出错的ssram程序):
- module ssram1(
- // ssram1 interface
- output [3:0]ssram1_bw, // synchronous byte write control
- output s1_BWEn, // byte write enable
- output s1_clk, // clk
- output s1_OEn, // output enable
- output s1_ADSCn, // address status controller
- output s1_CEn, // chip select
- output [18:0]ssram1_addr, // [18:2]acitve address [1:0]synchronous burst address inputs
- inout [31:0]ssram1_data,
- //ctl interface
- input clk_125m,
- input rstn,
- input rd_en,
- input [18:0] rd_addr_in,
- output [31:0] rd_data_out,
- input wr_en,
- input [18:0] wr_addr_in,
- input [31:0] wr_data_in,
- output [4:0]SSRAM_STATE
- );
- /*wire clk_125m;
- wire rstn;
- reg [3:0] ssram1_bw;
- reg s1_BWEn;
- wire s1_clk;
- reg s1_OEn;
- reg s1_ADSCn;
- reg s1_CEn;
- reg [18:0]ssram1_addr;
- (*KEEP = "TRUE"*)wire [31:0]ssram1_data;
- (*KEEP = "TRUE"*)reg [31:0]rd_data_in;
- (*KEEP = "TRUE"*)reg [31:0]rd_data_out;
- reg [4:0]SSRAM_STATE;*/
- assign ssram1_data = (ssram1_bw == 4'b1111)?(wr_data_in):(32'hFFFF_FFFF);
- //assign rd_data_out = (rd_en)?(ssram1_data):(32'hFFFF_FFFF);
- localparam RST = 5'b0_0000,
- RD_1 = 5'b0_0001,
- RD_2 = 5'b0_0010,
- RD_3 = 5'b0_0100,
- WR_1 = 5'b0_1000,
- WR_2 = 5'b1_0000;
-
- assign s1_clk = clk_125m;
- always@(posedge s1_clk or negedge rstn)begin
- if (!rstn) SSRAM_STATE <= RST;
- case(SSRAM_STATE)
- RST:begin
- ssram1_bw <= 0;
- s1_BWEn <= 0;
- s1_OEn <= 0;
- s1_ADSCn <= 0;
- s1_CEn <= 0;
- ssram1_addr <= 0;
- //ssram1_data<= 32'hFFFF_FFFF;
- if (rd_en) SSRAM_STATE <= RD_1;
- else if (wr_en) SSRAM_STATE <= WR_1;
- else SSRAM_STATE <= RST;
- end
- RD_1:begin
- s1_ADSCn <= 1;
- s1_BWEn <= 1;
- s1_OEn <= 0;
- s1_CEn <= 0;
- ssram1_bw <= 0;
- ssram1_addr <= rd_addr_in;
- SSRAM_STATE <= RD_2;
- end
- RD_2:begin
- SSRAM_STATE <= RD_3;
- end
- RD_3:begin
- rd_data_out <= ssram1_data;
- SSRAM_STATE <= RST;
- end
- WR_1:begin
- s1_CEn <=0;
- ssram1_addr <= wr_addr_in;
- SSRAM_STATE <= WR_2;
- end
- WR_2:begin
- s1_ADSCn <= 1;
- s1_BWEn <= 0;
- s1_OEn <= 1;
- ssram1_bw <= 4'b1111;
- SSRAM_STATE <= RST;
- end
- endcase
- end
- endmodule
加个 wire s1_clk;试下咯
有侠客能帮忙解决么啊?谢谢。好疑惑啊,为啥用xilinx自带的ISIM仿真都可以,但是用modelsim仿真会出现这个错误啊?
你编译的代码是不是没更新 看报错的行数和代码不匹配啊
在vlog compile RTL代码的时候把-93 option加上试试。
学习了
我是用ise调入modelsim仿真的,命令是自动的,怎么才能加-93 option呢?
ISE自带的仿真工具能仿真,说明你的代码应该没啥问题。
用modelsim仿真可以这样做:
(1)编译好相应的仿真库,Xilinx或者Altera的,ISE和Quartus都带了编译仿真库的软件,编译好后,查看modelsim.ini文件里面是否有那些仿真库。
(2)编写模块文件和模块文件的测试激励,比如counter.v和counter_tb,v
(3)写modelsim的counter_tb.do文件,内容如下:
quit -sim
vlib work
vlog "counter.v"
vlog "counter_tb.v"
# 这个是Xilinx的仿真库里面的核有些用这个文件,在ISE的安装目录。
vlog "glbl.v"
vsim -t 1ps -L simprims_ver -L unisims_ver -L xilinxcorelib_ver -L work -voptargs="+acc" counter_tb glbl
# 第一次仿真的时候,这里注释,保存仿真波形格式后放开。
#do {counter_tb_wave.do}
view wave -undock
view signals
run 10us
(4)打开modelsim,将目录切换到你的工程目录,在命令窗口中输入:do counter_tb.do,如果没有错,则会弹出波形查看窗口。
(5)添加你要查看的信号以及信号的格式,然后保存为counter_tb_wave.do,名字是上面注释没有放开的那个名字。
(6)将 #do {counter_tb_wave.do}的注释放开。
(7)仿真,调试。每次只用执行do counter_tb.do即可。
仿真时,EDA软件自动打开modelsim感觉很恶心,还是自己控制仿真器比较好。
小编,这个问题你最后如何解决的?
加一个reg型的中间变量,先将clk_125m赋值给这个中间变量,再将这个中间变量在48行赋给s1_clk
你这个模块开头变量的声明使用的是verilog-2001的标准,在module后面的括号里面已经声明(列出)的变量,后面就不要再声明他是reg还是wire了。需要写的都写到module后面的括号里面。这样:
- module xx(
- input wire a;
- output reg b
- );
谢谢指教
