Trying to verify Verilog/VHDL designs with formal methods and tools
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
4.4 KiB

  1. module properties (
  2. input Reset_n_i,
  3. input Clk_i,
  4. input [7:0] Din_i,
  5. input DinValid_i,
  6. input DinStart_i,
  7. input DinStop_i,
  8. input DinAccept_o,
  9. input [7:0] Dout_o,
  10. input DoutValid_o,
  11. input DoutStart_o,
  12. input DoutStop_o,
  13. input DoutAccept_i,
  14. // Internals
  15. input [2:0] s_fsm_state,
  16. input [7:0] s_header,
  17. input s_error,
  18. input [7:0] s_register [0:7]
  19. );
  20. `define READ 0
  21. `define WRITE 1
  22. reg init_state = 1;
  23. // Initial reset
  24. always @(*) begin
  25. if (init_state) assume (!Reset_n_i);
  26. if (!init_state) assume (Reset_n_i);
  27. end
  28. always @(posedge Clk_i)
  29. init_state = 0;
  30. // Default clocking & reset
  31. default clocking
  32. @(posedge Clk_i);
  33. endclocking
  34. default disable iff (!Reset_n_i);
  35. // Constraints
  36. assume property (
  37. DinValid_i && !DinAccept_o |=>
  38. $stable(DinValid_i)
  39. );
  40. assume property (
  41. DinValid_i && !DinAccept_o |=>
  42. $stable(Din_i)
  43. );
  44. assume property (
  45. DinValid_i && !DinAccept_o |=>
  46. $stable(DinStart_i)
  47. );
  48. assume property (
  49. DinValid_i && !DinAccept_o |=>
  50. $stable(DinStop_i)
  51. );
  52. // Asserts
  53. assert property (
  54. s_fsm_state >= 0 && s_fsm_state <= 6
  55. );
  56. assert property (
  57. DoutStart_o |->
  58. DoutValid_o
  59. );
  60. assert property (
  61. DoutStart_o && DoutAccept_i |=>
  62. !DoutStart_o
  63. );
  64. assert property (
  65. DoutStop_o |->
  66. DoutValid_o
  67. );
  68. assert property (
  69. DoutStop_o && DoutAccept_i |=>
  70. !DoutStop_o
  71. );
  72. assert property (
  73. s_fsm_state == 1 && DinValid_i && DinStart_i && DinAccept_o |=>
  74. s_header == $past(Din_i)
  75. );
  76. // State changes
  77. assert property (
  78. s_fsm_state == 0 |=> s_fsm_state == 1
  79. );
  80. assert property (
  81. s_fsm_state == 1 && DinValid_i && DinStart_i && DinStop_i && Din_i[3:0] == `READ |=>
  82. s_fsm_state == 2
  83. );
  84. assert property (
  85. s_fsm_state == 1 && DinValid_i && DinStart_i && !DinStop_i && Din_i[3:0] == `WRITE |=>
  86. s_fsm_state == 3
  87. );
  88. assert property (
  89. s_fsm_state == 2 |=> s_fsm_state == 4
  90. );
  91. assert property (
  92. s_fsm_state == 4 && DoutValid_o && DoutAccept_i && s_header[3:0] == `READ |=> s_fsm_state == 5
  93. );
  94. assert property (
  95. s_fsm_state == 4 && DoutValid_o && DoutAccept_i && s_header[3:0] != `READ |=> s_fsm_state == 6
  96. );
  97. assert property (
  98. s_fsm_state == 6 && DoutValid_o && DoutAccept_i |=> s_fsm_state == 0
  99. );
  100. // Protocol checks
  101. assert property (
  102. s_fsm_state > 1 |->
  103. s_header[3:0] inside {`READ, `WRITE}
  104. );
  105. assert property (
  106. s_fsm_state > 1 |=>
  107. $stable(s_header)
  108. );
  109. assert property (
  110. DoutStart_o && DoutValid_o |->
  111. Dout_o[3:0] == s_header[3:0]
  112. );
  113. assert property (
  114. s_fsm_state inside {1, 2, 3} |->
  115. !s_error
  116. );
  117. assert property (
  118. s_fsm_state >= 4 |->
  119. s_error == !(s_header[7:4] <= 7)
  120. );
  121. assert property (
  122. DoutStop_o && DoutValid_o |->
  123. Dout_o == s_error
  124. );
  125. assert property (
  126. DoutValid_o && !DoutAccept_i |=>
  127. $stable(Dout_o)
  128. );
  129. assert property (
  130. DoutValid_o && !DoutAccept_i |=>
  131. $stable(DoutStart_o)
  132. );
  133. assert property (
  134. DoutValid_o && !DoutAccept_i |=>
  135. $stable(DoutStop_o)
  136. );
  137. assert property (
  138. DoutValid_o |-> !(DoutStart_o && DoutStop_o)
  139. );
  140. assert property (
  141. DoutStart_o |-> s_fsm_state == 4
  142. );
  143. assert property (
  144. DoutStop_o |-> s_fsm_state == 6
  145. );
  146. assert property (
  147. DoutValid_o |-> s_fsm_state >= 4 && s_fsm_state <= 6
  148. );
  149. // Write ack frame
  150. assert property (
  151. DoutValid_o && DoutStart_o && DoutAccept_i && Dout_o[3:0] == `WRITE |=>
  152. !DoutValid_o ##1
  153. DoutValid_o && DoutStop_o
  154. );
  155. // Read ack frame
  156. assert property (
  157. DoutValid_o && DoutStart_o && DoutAccept_i && Dout_o[3:0] == `READ |=>
  158. !DoutValid_o ##1
  159. DoutValid_o && !DoutStart_o && !DoutStop_o && !DoutAccept_i [*] ##1
  160. DoutValid_o && !DoutStart_o && !DoutStop_o && DoutAccept_i ##1
  161. !DoutValid_o ##1
  162. DoutValid_o && DoutStop_o
  163. );
  164. // Can only be proven with abc at the moment
  165. // smtbmc fails with unbounded proof
  166. assert property (
  167. s_fsm_state == 1 && DinValid_i && DinStart_i && !DinStop_i && DinAccept_o && Din_i[3:0] == `WRITE && Din_i[7:4] <= 7 ##1
  168. !DinValid_i [*] ##1
  169. s_fsm_state == 3 && DinValid_i && DinAccept_o && DinStop_i |=>
  170. s_register[s_header[7:4]] == $past(Din_i)
  171. );
  172. endmodule
  173. bind vai_reg properties properties (.*);