aboutsummaryrefslogtreecommitdiffstats
path: root/src/hls/HTLgen.v
diff options
context:
space:
mode:
authorMichalis Pardalos <m.pardalos@gmail.com>2021-09-11 00:57:55 +0100
committerMichalis Pardalos <m.pardalos@gmail.com>2021-09-11 00:57:55 +0100
commit9b05e2cf60d8c8754a3742262a95be8bdd8911e9 (patch)
tree3206bb244a324dc873b33f03cb13e28af3a5a731 /src/hls/HTLgen.v
parent5e10b594320127a8ffa063e7ccba78a4a9f2b1a5 (diff)
downloadvericert-9b05e2cf60d8c8754a3742262a95be8bdd8911e9.tar.gz
vericert-9b05e2cf60d8c8754a3742262a95be8bdd8911e9.zip
Guard join state with called module finish
Needed to match RTL semantics, since the join state executes once before the call is initiated, and we need the destination register to not be affected until after the call has returned.
Diffstat (limited to 'src/hls/HTLgen.v')
-rw-r--r--src/hls/HTLgen.v7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/hls/HTLgen.v b/src/hls/HTLgen.v
index 39146ff..908c627 100644
--- a/src/hls/HTLgen.v
+++ b/src/hls/HTLgen.v
@@ -490,8 +490,9 @@ Definition fork (rst : reg) (params : list (reg * reg)) : datapath_stmnt :=
let assign_params := nonblock_all params in
Vseq reset_mod assign_params.
-Definition join (fn_rtrn fn_rst fn_dst : reg) : datapath_stmnt :=
- let set_result := Vnonblock (Vvar fn_dst) (Vvar fn_rtrn) in
+Definition join (fn_fin fn_rst fn_rtrn fn_dst : reg) : datapath_stmnt :=
+ let set_result := Vcond (boplitz Veq fn_fin 1)
+ (Vnonblock (Vvar fn_dst) (Vvar fn_rtrn)) Vskip in
let stop_reset := Vnonblock (Vvar fn_rst) (Vlit (ZToValue 0)) in
Vseq stop_reset set_result.
@@ -558,7 +559,7 @@ Definition transf_instr (ge : RTL.genv) (fin rtrn stack: reg) (ni: node * instru
do return_reg <- map_externctrl fn ctrl_return;
let fork_instr := fork reset_reg params in
- let join_instr := join return_reg reset_reg dst in
+ let join_instr := join finish_reg reset_reg return_reg dst in
do _ <- add_instr n join_state fork_instr;
add_instr_wait finish_reg join_state n' join_instr