Browse Source

Add vai_reg to README; using SVA default clocking

verific_problem symbiyosys_error
T. Meissner 5 years ago
parent
commit
1deb6e9789
2 changed files with 35 additions and 27 deletions
  1. +5
    -1
      README.md
  2. +30
    -26
      vai_reg/properties.sv

+ 5
- 1
README.md View File

@ -1,10 +1,11 @@
The original repository is located on my own git-server at [https://git.goodcleanfun.de/tmeissner/formal_verification](https://git.goodcleanfun.de/tmeissner/formal_verification) The original repository is located on my own git-server at [https://git.goodcleanfun.de/tmeissner/formal_verification](https://git.goodcleanfun.de/tmeissner/formal_verification)
It is mirrored to github with every push, so both should be in sync. It is mirrored to github with every push, so both should be in sync.
# formal_verification # formal_verification
Tests and examples of using formal verification to check correctness of digital hardware designs. All tests are done with SymbiYosys, a front-end for formal verification flows based on [Yosys](https://github.com/YosysHQ). Some examples use the VHDL/SystemVerilog parser plugin by Verific which isn't free SW and not included in the free Yosys version. See on the [Symbiotic EDA website](https://www.symbioticeda.com) for more information.
Tests and examples of using formal verification to check correctness of digital hardware designs. All tests are done with SymbiYosys, a front-end for formal verification flows based on [Yosys](https://github.com/YosysHQ). Some examples use the VHDL/SystemVerilog parser plugin by Verific which isn't free SW and not included in the free Yosys version. See on the [Symbiotic EDA website](https://www.symbioticeda.com) for more information.
### alu ### alu
A simple ALU design in VHDL, together with a formal testbench written in SystemVerilog. The testbench contains various simple SVA properties used by assert & cover directives which are proved with the SymbiYosys tool. A simple ALU design in VHDL, together with a formal testbench written in SystemVerilog. The testbench contains various simple SVA properties used by assert & cover directives which are proved with the SymbiYosys tool.
@ -15,3 +16,6 @@ A simple counter design in VHDL, together with a formal testbench written in Sys
### dlatch ### dlatch
A simple test design which generates the `Unsupported cell type $dlatchsr` error using with Verific plugin. A simple test design which generates the `Unsupported cell type $dlatchsr` error using with Verific plugin.
### vai_reg
A simple register file with VAI (valid-accept-interface) which serves as test design to try formal verification of FSMs.

+ 30
- 26
vai_reg/properties.sv View File

@ -33,20 +33,24 @@ module properties (
always @(posedge Clk_i) always @(posedge Clk_i)
init_state = 0; init_state = 0;
default clocking
@(posedge Clk_i);
endclocking
// Constraints // Constraints
assume property (@(posedge Clk_i)
assume property (
DinValid_i && !DinAccept_o |=> DinValid_i && !DinAccept_o |=>
$stable(Din_i) $stable(Din_i)
); );
assume property (@(posedge Clk_i)
assume property (
DinValid_i && !DinAccept_o |=> DinValid_i && !DinAccept_o |=>
$stable(DinStart_i) $stable(DinStart_i)
); );
assume property (@(posedge Clk_i)
assume property (
DinValid_i && !DinAccept_o |=> DinValid_i && !DinAccept_o |=>
$stable(DinStop_i) $stable(DinStop_i)
); );
@ -54,31 +58,31 @@ module properties (
// Asserts // Asserts
assert property (@(posedge Clk_i)
assert property (
s_fsm_state >= 0 && s_fsm_state <= 6 s_fsm_state >= 0 && s_fsm_state <= 6
); );
assert property (@(posedge Clk_i)
assert property (
DoutStart_o |-> DoutStart_o |->
DoutValid_o DoutValid_o
); );
assert property (@(posedge Clk_i)
assert property (
DoutStart_o && DoutAccept_i |=> DoutStart_o && DoutAccept_i |=>
!DoutStart_o !DoutStart_o
); );
assert property (@(posedge Clk_i)
assert property (
DoutStop_o |-> DoutStop_o |->
DoutValid_o DoutValid_o
); );
assert property (@(posedge Clk_i)
assert property (
DoutStop_o && DoutAccept_i |=> DoutStop_o && DoutAccept_i |=>
!DoutStop_o !DoutStop_o
); );
assert property (@(posedge Clk_i)
assert property (
s_fsm_state == 1 && DinValid_i && DinStart_i && DinAccept_o |=> s_fsm_state == 1 && DinValid_i && DinStart_i && DinAccept_o |=>
s_header == $past(Din_i) s_header == $past(Din_i)
); );
@ -86,77 +90,77 @@ module properties (
// State changes // State changes
assert property (@(posedge Clk_i) disable iff (!Reset_n_i)
assert property (disable iff (!Reset_n_i)
s_fsm_state == 0 |=> s_fsm_state == 1 s_fsm_state == 0 |=> s_fsm_state == 1
); );
assert property (@(posedge Clk_i) disable iff (!Reset_n_i)
assert property (disable iff (!Reset_n_i)
s_fsm_state == 1 && DinValid_i && DinStart_i && DinStop_i && Din_i[3:0] == `READ |=> s_fsm_state == 1 && DinValid_i && DinStart_i && DinStop_i && Din_i[3:0] == `READ |=>
s_fsm_state == 2 s_fsm_state == 2
); );
assert property (@(posedge Clk_i) disable iff (!Reset_n_i)
assert property (disable iff (!Reset_n_i)
s_fsm_state == 1 && DinValid_i && DinStart_i && !DinStop_i && Din_i[3:0] == `WRITE |=> s_fsm_state == 1 && DinValid_i && DinStart_i && !DinStop_i && Din_i[3:0] == `WRITE |=>
s_fsm_state == 3 s_fsm_state == 3
); );
assert property (@(posedge Clk_i) disable iff (!Reset_n_i)
assert property (disable iff (!Reset_n_i)
s_fsm_state == 2 |=> s_fsm_state == 4 s_fsm_state == 2 |=> s_fsm_state == 4
); );
assert property (@(posedge Clk_i) disable iff (!Reset_n_i)
assert property (disable iff (!Reset_n_i)
s_fsm_state == 4 && DoutValid_o && DoutAccept_i && s_header[3:0] == `READ |=> s_fsm_state == 5 s_fsm_state == 4 && DoutValid_o && DoutAccept_i && s_header[3:0] == `READ |=> s_fsm_state == 5
); );
assert property (@(posedge Clk_i) disable iff (!Reset_n_i)
assert property (disable iff (!Reset_n_i)
s_fsm_state == 4 && DoutValid_o && DoutAccept_i && s_header[3:0] != `READ |=> s_fsm_state == 6 s_fsm_state == 4 && DoutValid_o && DoutAccept_i && s_header[3:0] != `READ |=> s_fsm_state == 6
); );
assert property (@(posedge Clk_i) disable iff (!Reset_n_i)
assert property (disable iff (!Reset_n_i)
s_fsm_state == 6 && DoutValid_o && DoutAccept_i |=> s_fsm_state == 0 s_fsm_state == 6 && DoutValid_o && DoutAccept_i |=> s_fsm_state == 0
); );
// Protocol checks // Protocol checks
assert property (@(posedge Clk_i)
assert property (
s_fsm_state > 1 |-> s_fsm_state > 1 |->
s_header[3:0] == `READ || s_header[3:0] == `WRITE
s_header[3:0] inside {`READ, `WRITE}
); );
assert property (@(posedge Clk_i)
assert property (
DoutStart_o && DoutValid_o |-> DoutStart_o && DoutValid_o |->
Dout_o[3:0] == s_header[3:0] Dout_o[3:0] == s_header[3:0]
); );
assert property (@(posedge Clk_i)
assert property (
DoutValid_o && !DoutAccept_i |=> DoutValid_o && !DoutAccept_i |=>
$stable(Dout_o) $stable(Dout_o)
); );
assert property (@(posedge Clk_i)
assert property (
DoutValid_o && !DoutAccept_i |=> DoutValid_o && !DoutAccept_i |=>
$stable(DoutStart_o) $stable(DoutStart_o)
); );
assert property (@(posedge Clk_i)
assert property (
DoutValid_o && !DoutAccept_i |=> DoutValid_o && !DoutAccept_i |=>
$stable(DoutStop_o) $stable(DoutStop_o)
); );
assert property (@(posedge Clk_i)
assert property (
DoutValid_o |-> !(DoutStart_o && DoutStop_o) DoutValid_o |-> !(DoutStart_o && DoutStop_o)
); );
assert property (@(posedge Clk_i)
assert property (
DoutStart_o |-> s_fsm_state == 4 DoutStart_o |-> s_fsm_state == 4
); );
assert property (@(posedge Clk_i)
assert property (
DoutStop_o |-> s_fsm_state == 6 DoutStop_o |-> s_fsm_state == 6
); );
assert property (@(posedge Clk_i)
assert property (
DoutValid_o |-> s_fsm_state >= 4 && s_fsm_state <= 6 DoutValid_o |-> s_fsm_state >= 4 && s_fsm_state <= 6
); );


Loading…
Cancel
Save