微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > modelsim中'xxx' already declared in this scope (yyy). 错误怎么解决?

modelsim中'xxx' already declared in this scope (yyy). 错误怎么解决?

时间:10-02 整理:3721RD 点击:
我用xilinx自带的ISIM仿真,可以正常使用。
但是用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程序):

  1. module ssram1(

  2. // ssram1 interface
  3. output [3:0]ssram1_bw,        // synchronous byte write control
  4. output s1_BWEn,                        // byte write enable
  5. output s1_clk,                                // clk
  6. output s1_OEn,                                // output enable
  7. output s1_ADSCn,                        // address status controller
  8. output s1_CEn,                                // chip select
  9. output [18:0]ssram1_addr,                        // [18:2]acitve address [1:0]synchronous burst address inputs
  10. inout [31:0]ssram1_data,

  11. //ctl interface
  12. input clk_125m,
  13. input rstn,
  14. input rd_en,
  15. input [18:0] rd_addr_in,
  16. output [31:0] rd_data_out,
  17. input wr_en,
  18. input [18:0] wr_addr_in,
  19. input [31:0] wr_data_in,
  20. output [4:0]SSRAM_STATE
  21. );

  22. /*wire clk_125m;
  23. wire rstn;
  24. reg [3:0] ssram1_bw;
  25. reg s1_BWEn;
  26. wire s1_clk;
  27. reg s1_OEn;
  28. reg s1_ADSCn;
  29. reg s1_CEn;
  30. reg [18:0]ssram1_addr;
  31. (*KEEP = "TRUE"*)wire [31:0]ssram1_data;
  32. (*KEEP = "TRUE"*)reg [31:0]rd_data_in;
  33. (*KEEP = "TRUE"*)reg [31:0]rd_data_out;
  34. reg [4:0]SSRAM_STATE;*/

  35. assign ssram1_data = (ssram1_bw == 4'b1111)?(wr_data_in):(32'hFFFF_FFFF);
  36. //assign rd_data_out = (rd_en)?(ssram1_data):(32'hFFFF_FFFF);
  37. localparam RST  = 5'b0_0000,
  38.            RD_1 = 5'b0_0001,
  39.                           RD_2 = 5'b0_0010,
  40.                           RD_3 = 5'b0_0100,
  41.                           WR_1 = 5'b0_1000,
  42.                           WR_2 = 5'b1_0000;
  43.                           
  44. assign s1_clk = clk_125m;

  45. always@(posedge s1_clk or negedge rstn)begin
  46.    if (!rstn) SSRAM_STATE <= RST;
  47.    case(SSRAM_STATE)
  48.         RST:begin
  49.                  ssram1_bw <= 0;
  50.                  s1_BWEn <= 0;
  51.                  s1_OEn <= 0;
  52.                  s1_ADSCn <= 0;
  53.                  s1_CEn <= 0;
  54.                  ssram1_addr <= 0;
  55.                  //ssram1_data<= 32'hFFFF_FFFF;
  56.                  if (rd_en) SSRAM_STATE <= RD_1;
  57.                  else if (wr_en) SSRAM_STATE <= WR_1;
  58.                  else SSRAM_STATE <= RST;
  59.         end
  60.         RD_1:begin
  61.             s1_ADSCn <= 1;
  62.                  s1_BWEn <= 1;
  63.                  s1_OEn <= 0;
  64.                  s1_CEn <= 0;
  65.                  ssram1_bw <= 0;
  66.                  ssram1_addr <= rd_addr_in;
  67.                  SSRAM_STATE <= RD_2;
  68.         end
  69.         RD_2:begin
  70.             SSRAM_STATE <= RD_3;
  71.         end
  72.         RD_3:begin
  73.             rd_data_out <= ssram1_data;
  74.             SSRAM_STATE <= RST;
  75.         end
  76.         WR_1:begin
  77.             s1_CEn <=0;
  78.                  ssram1_addr <= wr_addr_in;
  79.                  SSRAM_STATE <= WR_2;
  80.         end
  81.         WR_2:begin
  82.             s1_ADSCn <= 1;
  83.                  s1_BWEn <= 0;
  84.                  s1_OEn <= 1;
  85.                  ssram1_bw <= 4'b1111;
  86.                  SSRAM_STATE <= RST;
  87.         end
  88.         endcase
  89. end

  90. 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后面的括号里面。这样:

  1. module xx(
  2. input wire a;
  3. output reg b
  4. );

复制代码

谢谢指教

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top