Vivado 随笔(3) 其他综合属性 dont_touch、fsm_encoding?

举报
李锐博恩 发表于 2021/07/15 02:08:36 2021/07/15
【摘要】 目录 dont_touch fsm_encoding   dont_touch 可以参考: Vivado中如何避免信号被优化掉? fsm_encoding 我们在RTL设计中,在状态机的设计中,会给状态变量一些状态编码,在parameter中给出, 例如: 这是二进制编码: 这是格雷码: 这是独热码: 但是在RTL中这么设计真...

目录

dont_touch

fsm_encoding


 

dont_touch

可以参考:

Vivado中如何避免信号被优化掉?

fsm_encoding

我们在RTL设计中,在状态机的设计中,会给状态变量一些状态编码,在parameter中给出,

例如:

这是二进制编码:

这是格雷码:

这是独热码:

但是在RTL中这么设计真的有用吗?或者说综合工具就会给综合成这种编码方式?


光说不练假把式,我们来实际看看综合情况:

拿这篇博客中:【 FPGA 】序列检测器的Moore状态机实现中的序列检测器为例:

设计一个序列检测器,检测序列1101,检测到输出1,否则输出0.

编码方式:二进制编码


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer: 李锐博恩
  5. // Create Date: 2019/01/04 11:16:29
  6. // Module Name: seq_det_moore
  7. //编码方式:二进制编码
  8. //
  9. module seq_det_moore(
  10. input clk,
  11. input reset,
  12. input din,
  13. output reg dout
  14. );
  15. //状态声明
  16. localparam [2:0]
  17. s0 = 3'b000,
  18. s1 = 3'b001,
  19. s2 = 3'b010,
  20. s3 = 3'b011,
  21. s4 = 3'b100;
  22. reg [2:0] current_state,next_state;
  23. always @(posedge clk, posedge reset)
  24. begin
  25. if(reset)
  26. current_state <= s0;
  27. else
  28. current_state <= next_state;
  29. end
  30. always @ *
  31. begin
  32. case(current_state)
  33. s0:
  34. if(din == 1'b1) next_state = s1;
  35. else next_state = s0;
  36. s1:
  37. if(din == 1'b1) next_state = s2;
  38. else next_state = s0;
  39. s2:
  40. if(din == 1'b0) next_state = s3;
  41. else next_state = s2;
  42. s3:
  43. if(din == 1'b1) next_state = s4;
  44. else next_state = s0;
  45. s4:
  46. if(din == 1'b1) next_state = s1;
  47. else next_state = s0;
  48. default: next_state = s0;
  49. endcase
  50. end
  51. always @*
  52. begin
  53. if(current_state == s4) dout = 1;
  54. else dout = 0;
  55. end
  56. endmodule

打开log,可以看到状态机的编码方式为:

如果在RTL设计中采用独热码设计:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer: 李锐博恩
  5. // Create Date: 2019/10/23 16:14:30
  6. // Module Name: seq_det_moore
  7. //编码方式:独热码编码
  8. //
  9. module seq_detect(
  10. input clk,
  11. input reset,
  12. input din,
  13. output reg dout
  14. );
  15. //状态声明
  16. localparam [4:0]
  17. s0 = 5'b00001,
  18. s1 = 5'b00010,
  19. s2 = 5'b00100,
  20. s3 = 5'b01000,
  21. s4 = 5'b10000;
  22. reg [4:0] current_state,next_state;
  23. always @(posedge clk, posedge reset)
  24. begin
  25. if(reset)
  26. current_state <= s0;
  27. else
  28. current_state <= next_state;
  29. end
  30. always @ *
  31. begin
  32. case(current_state)
  33. s0:
  34. if(din == 1'b1) next_state = s1;
  35. else next_state = s0;
  36. s1:
  37. if(din == 1'b1) next_state = s2;
  38. else next_state = s0;
  39. s2:
  40. if(din == 1'b0) next_state = s3;
  41. else next_state = s2;
  42. s3:
  43. if(din == 1'b1) next_state = s4;
  44. else next_state = s0;
  45. s4:
  46. if(din == 1'b1) next_state = s1;
  47. else next_state = s0;
  48. default: next_state = s0;
  49. endcase
  50. end
  51. always @*
  52. begin
  53. if(current_state == s4) dout = 1;
  54. else dout = 0;
  55. end
  56. endmodule

特么还真是独热码!

如果我们加上这条综合属性呢:(在状态变量之前加上此综合属性)

  (*fsm_encoding = "sequential"*) reg [4:0] current_state,next_state;

可见,即使你代码里面用了独热码,但是加了这条综合属性后,最终综合工具会断定状态机的编码方式为综合属性指定的编码方式。

所以,在RTL代码中直接用十进制来设计即可,至于综合成什么样子的编码,通过综合属性来指定即可。


这句话告诉你如何查看FSM的信息:

The Vivado synthesis flags INFO messages in the log file, giving information about Finite State Machine (FSM) components and their encoding. The following are example messages: INFO: [Synth 8-802] inferred FSM for state register 'state_reg' in module 'fsm_test' INFO: [Synth 8-3354] encoded FSM with state register 'state_reg' using encoding 'sequential' in module 'fsm_test'

简而言之,在log文件中查看即可。

参考:UG901

 

 

 

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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