diff options
author | Ondrej Ille <ondrej.ille@gmail.com> | 2021-04-07 09:55:16 +0200 |
---|---|---|
committer | tgingold <tgingold@users.noreply.github.com> | 2021-04-08 20:22:42 +0200 |
commit | 32bcb07c7d7a809fc94fc438835e5e3109ace30a (patch) | |
tree | fc3d6d111c62a69064a524efc17fcff55f9aba86 /src/vhdl/translate/trans-chap9.adb | |
parent | 3cbf31356ebc38d8c92eaf640455b35164246ef9 (diff) | |
download | ghdl-32bcb07c7d7a809fc94fc438835e5e3109ace30a.tar.gz ghdl-32bcb07c7d7a809fc94fc438835e5e3109ace30a.tar.bz2 ghdl-32bcb07c7d7a809fc94fc438835e5e3109ace30a.zip |
src: Introduce two separate PSL counters (Finish and Start).
Finish counter corresponds to legacy count.
Start counter corresponds to number of times start
state is left (assertion is triggered).
Diffstat (limited to 'src/vhdl/translate/trans-chap9.adb')
-rw-r--r-- | src/vhdl/translate/trans-chap9.adb | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/src/vhdl/translate/trans-chap9.adb b/src/vhdl/translate/trans-chap9.adb index 4acb0c01f..f9d8f5054 100644 --- a/src/vhdl/translate/trans-chap9.adb +++ b/src/vhdl/translate/trans-chap9.adb @@ -342,17 +342,19 @@ package body Trans.Chap9 is New_Index_Lit (Unsigned_64 (Get_PSL_Nbr_States (Stmt)))); New_Type_Decl (Create_Identifier ("VECTTYPE"), Info.Psl_Vect_Type); - -- Create the variables. + -- Create count variables if Get_Kind (Stmt) = Iir_Kind_Psl_Endpoint_Declaration then -- FIXME: endpoint is a variable (and not a signal). This is required -- to have the right value for the current cycle, but as a -- consequence, this process must be evaluated before using the -- endpoint. - Info.Psl_Count_Var := Create_Var + Info.Psl_Finish_Count_Var := Create_Var (Create_Var_Identifier ("ENDPOINT"), Std_Boolean_Type_Node); else - Info.Psl_Count_Var := Create_Var - (Create_Var_Identifier ("COUNT"), Ghdl_Index_Type); + Info.Psl_Finish_Count_Var := Create_Var + (Create_Var_Identifier ("FINISH_COUNT"), Ghdl_Index_Type); + Info.Psl_Start_Count_Var := Create_Var + (Create_Var_Identifier ("START_COUNT"), Ghdl_Index_Type); end if; Info.Psl_State_Var := Create_Var @@ -530,6 +532,7 @@ package body Trans.Chap9 is Instance : O_Dnode; Var_I : O_Dnode; Var_Nvec : O_Dnode; + Var_SFlag : O_Dnode; Report_Proc : O_Dnode; Label : O_Snode; Clk_Blk : O_If_Block; @@ -595,6 +598,8 @@ package body Trans.Chap9 is New_Lit (Std_Boolean_False_Node)); Inc_Var (Var_I); Finish_Loop_Stmt (Label); + -- Flag for active edge from start state (assertion "started" flag) + New_Var_Decl (Var_SFlag, Wki_Flag, O_Storage_Local, Ghdl_Bool_Type); Finish_Declare_Stmt; -- Global 'if' statement for the clock. @@ -602,6 +607,9 @@ package body Trans.Chap9 is Start_If_Stmt (Clk_Blk, Translate_Psl_Expr (Get_PSL_Clock (Stmt), False)); + -- Default "started" flag is not set + New_Assign_Stmt (New_Obj (Var_SFlag), New_Lit (Ghdl_Bool_False_Node)); + -- Default simplified state -> Inactive New_Assign_Stmt (Get_Var (Info.Psl_State_Var), New_Lit (Trans.Rtis.Ghdl_Rti_Psl_State_Inactive)); @@ -641,10 +649,17 @@ package body Trans.Chap9 is New_Lit (D_Lit)))); Cond := New_Dyadic_Op (ON_And, Cond, Translate_Psl_Expr (Get_Edge_Expr (E), False)); + + -- If NFA edge expression is valid -> Fire-up destination state. Start_If_Stmt (E_Blk, Cond); New_Assign_Stmt (New_Indexed_Element (New_Obj (Var_Nvec), New_Lit (D_Lit)), New_Lit (Std_Boolean_True_Node)); + -- If we fire from start state -> set "started" flag. + if S = Get_First_State (NFA) then + New_Assign_Stmt (New_Obj (Var_SFlag), + New_Lit (Ghdl_Bool_True_Node)); + end if; Finish_If_Stmt (E_Blk); Close_Temp; @@ -667,7 +682,7 @@ package body Trans.Chap9 is (Unsigned_64 (S_Num))))); if Get_Kind (Stmt) = Iir_Kind_Psl_Endpoint_Declaration then - New_Assign_Stmt (Get_Var (Info.Psl_Count_Var), Cond); + New_Assign_Stmt (Get_Var (Info.Psl_Finish_Count_Var), Cond); else Start_If_Stmt (S_Blk, Cond); Open_Temp; @@ -697,14 +712,23 @@ package body Trans.Chap9 is Error_Kind ("Translate_Psl_Directive_Statement", Stmt); end case; New_Assign_Stmt - (Get_Var (Info.Psl_Count_Var), + (Get_Var (Info.Psl_Finish_Count_Var), New_Dyadic_Op (ON_Add_Ov, - New_Value (Get_Var (Info.Psl_Count_Var)), + New_Value (Get_Var (Info.Psl_Finish_Count_Var)), New_Lit (Ghdl_Index_1))); Close_Temp; Finish_If_Stmt (S_Blk); end if; + -- Check "started" flag, increment started count if set + Start_If_Stmt (S_Blk, New_Value (New_Obj (Var_SFlag))); + New_Assign_Stmt + (Get_Var (Info.Psl_Start_Count_Var), + New_Dyadic_Op (ON_Add_Ov, + New_Value (Get_Var (Info.Psl_Start_Count_Var)), + New_Lit (Ghdl_Index_1))); + Finish_If_Stmt (S_Blk); + -- Assign state vector. Start_Declare_Stmt; New_Var_Decl (Var_I, Wki_I, O_Storage_Local, Ghdl_Index_Type); @@ -797,7 +821,7 @@ package body Trans.Chap9 is Start_If_Stmt (S_Blk, New_Compare_Op (ON_Eq, - New_Value (Get_Var (Info.Psl_Count_Var)), + New_Value (Get_Var (Info.Psl_Finish_Count_Var)), New_Lit (Ghdl_Index_0), Ghdl_Bool_Type)); Start_Association (Assocs, Report_Proc); @@ -1900,7 +1924,7 @@ package body Trans.Chap9 is else Init := Ghdl_Index_0; end if; - New_Assign_Stmt (Get_Var (Info.Psl_Count_Var), New_Lit (Init)); + New_Assign_Stmt (Get_Var (Info.Psl_Finish_Count_Var), New_Lit (Init)); end Elab_Psl_Directive; procedure Elab_Implicit_Guard_Signal |