Modelsim下进行功能仿真没问题,可是在ISE综合报错,如何解决?

举报
李锐博恩 发表于 2021/07/15 07:35:07 2021/07/15
【摘要】 2018/08/29更新:Verilog HDL语言设计规范中讲到:一个reg变量只能在一个always语句中赋值,下面的问题就违反了这个原则。 更多规范见我的另一篇博文:Verilog HDL 使用规范(一) 用状态机描述转移图的方式,去设计一个模为5的计数器。出现了一系列的问题,一度让我崩溃。最终找到了问题的来源,且看问题以及排错过程。 问题如题目,我的...

2018/08/29更新:Verilog HDL语言设计规范中讲到:一个reg变量只能在一个always语句中赋值,下面的问题就违反了这个原则。

更多规范见我的另一篇博文:Verilog HDL 使用规范(一)

用状态机描述转移图的方式,去设计一个模为5的计数器。出现了一系列的问题,一度让我崩溃。最终找到了问题的来源,且看问题以及排错过程。

问题如题目,我的代码为:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 22:12:23 08/03/2018
  7. // Design Name:
  8. // Module Name: counter5
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module counter5(clk,rst, cnt, co);
  22. input clk;
  23. input rst;
  24. output[2:0] cnt;
  25. output co;
  26. reg co;
  27. reg[2:0] pre_state, next_state;
  28. parameter s0 = 3'b000, s1 = 3'b001, s2 = 3'b010, s3 = 3'b011, s4 = 3'b100;
  29. always@(posedge clk or posedge rst)
  30. begin
  31. if(rst)
  32. begin
  33. pre_state <= s0;
  34. co <= 1'b0;
  35. end
  36. else
  37. begin
  38. pre_state <= next_state;
  39. end
  40. end
  41. always@(pre_state)
  42. begin
  43. case(pre_state)
  44. s0:
  45. begin
  46. next_state = s1;
  47. co = 1'b0;
  48. end
  49. s1:
  50. begin
  51. next_state = s2;
  52. co = 1'b0;
  53. end
  54. s2:
  55. begin
  56. next_state = s3;
  57. co = 1'b0;
  58. end
  59. s3:
  60. begin
  61. next_state = s4;
  62. co = 1'b0;
  63. end
  64. s4:
  65. begin
  66. next_state = s0;
  67. co = 1'b1;
  68. end
  69. default:
  70. begin
  71. next_state = s0;
  72. co = 1'b0;
  73. end
  74. endcase
  75. end
  76. assign cnt = pre_state;
  77. endmodule

此代码在Modelsim中进行功能仿真完全没问题,仿真图如下:

然后,我就在ISE中进行综合,然后总会综合失败,且报错如下:

Line 32: Signal co in unit counter5 is connected to following multiple drivers:
Driver 0: output signal co of instance pre_state[2]_GND_1_o_Mux_2 (pre_state[2]_GND_1_o_Mux_2).
Driver 1: output signal co of instance Latch (co).
Module counter5 remains a blackbox, due to errors in its contents
WARNING:HDLCompiler:1499 - "G:\ISE_file\cnt5\cnt5.v" Line 21: Empty module <counter5> remains a black box.
--> 

Total memory usage is 204416 kilobytes

Number of errors   :    1 (   0 filtered)
Number of warnings :    1 (   0 filtered)
Number of infos    :    0 (   0 filtered)


Process "Synthesize - XST" failed

红色部分是我最终找到问题的关键,它的意思是我的co出问题了。那我们看我们代码中的co。

在如下部分always中出现了一次:

always@(posedge clk or posedge rst)
begin
    if(rst)
    begin
        pre_state <= s0;
        co <= 1'b0;
    end
    else
    begin
    
        pre_state <= next_state;
    end

end

在下面always中又出现各种赋值:

always@(pre_state)
begin
    case(pre_state)
    s0:
    begin
        next_state = s1;
        co = 1'b0;
    end
    s1:
    begin
        next_state = s2;
        co = 1'b0;
    end
    s2:
    begin
        next_state = s3;
        co = 1'b0;
    end
    s3:
    begin
        next_state = s4;
        co = 1'b0;
    end
    s4:
    begin
        next_state = s0;
        co = 1'b1;
    end
    default:
    begin
        next_state = s0;
        co = 1'b0;
    end
    endcase
    
end

这个co的赋值在下面一个always中是必须的,由于这是我在不同状态下的输出,因此这个不能动,那么我就注释掉上面的一个always中的co,那个赋值不要也行,赋值在下面一个always块中也能完成,因此问题可能出现在这个地方,注释掉了之后,奇迹出现了综合通过。

贴出最终代码:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 22:12:23 08/03/2018
  7. // Design Name:
  8. // Module Name: counter5
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module counter5(clk,rst, cnt, co);
  22. input clk;
  23. input rst;
  24. output[2:0] cnt;
  25. output co;
  26. reg co;
  27. reg[2:0] pre_state, next_state;
  28. parameter s0 = 3'b000, s1 = 3'b001, s2 = 3'b010, s3 = 3'b011, s4 = 3'b100;
  29. always@(posedge clk or posedge rst)
  30. begin
  31. if(rst)
  32. begin
  33. pre_state <= s0;
  34. end
  35. else
  36. begin
  37. pre_state <= next_state;
  38. end
  39. end
  40. always@(pre_state)
  41. begin
  42. case(pre_state)
  43. s0:
  44. begin
  45. next_state = s1;
  46. co = 1'b0;
  47. end
  48. s1:
  49. begin
  50. next_state = s2;
  51. co = 1'b0;
  52. end
  53. s2:
  54. begin
  55. next_state = s3;
  56. co = 1'b0;
  57. end
  58. s3:
  59. begin
  60. next_state = s4;
  61. co = 1'b0;
  62. end
  63. s4:
  64. begin
  65. next_state = s0;
  66. co = 1'b1;
  67. end
  68. default:
  69. begin
  70. next_state = s0;
  71. co = 1'b0;
  72. end
  73. endcase
  74. end
  75. assign cnt = pre_state;
  76. endmodule

Modelsim中仿真同样没问题,ISE中综合也能通过了。综合出来的RTL原理图为:

虽然分析如此,但是这个分析的过程远比这个复杂的多,由于没遇到过这种情况,让我几乎崩溃。还好最终解决了这个问题。

后来,貌似也搜到了网上其他同学类似的问题,地址如下:

verilog程序,ISE 10.1环境下,检查语法和仿真均可,综合出错“ this signal is connected to multiple drivers.”

这位同学的意思是:

此类错误系将某同一个reg变量在多个个always块中进行了赋值操作,此类程序是不可综合的,因此须修改程序。

切记,对于同一个reg型变量只能在一个always块中对其值进行修改,当然在其它块中可以引用其值!

总结的真不错,很感谢哎!

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/81396066

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。