diff --git a/modules/common/gc_sync_word_wr.vhd b/modules/common/gc_sync_word_wr.vhd
index 24343526cd6c54404405a0c72dc6499c911eefae..906885f2b76b9089a82ec8761a44f5cb3291d417 100644
--- a/modules/common/gc_sync_word_wr.vhd
+++ b/modules/common/gc_sync_word_wr.vhd
@@ -10,7 +10,7 @@
 --   Used to transfer a word from the input clock domain to the output clock
 --   domain.  User provides the data and a pulse write signal to transfer the
 --   data.  When the data are transfered, a write pulse is generated on the
---   output side along with the data, and an acknowledge is geenrated on the
+--   output side along with the data, and an acknowledge is generated on the
 --   input side.  Once the user request a transfer, no new data should be
 --   requested for a transfer until the ack was received.
 --
@@ -52,44 +52,46 @@ entity gc_sync_word_wr is
 end entity;
 
 architecture behav of gc_sync_word_wr is
-  signal data : std_logic_vector (width - 1 downto 0);
-  signal in_busy : std_logic;
-  signal in_progress : std_logic;
-
-  signal ack_start, ack_done : std_logic;
+  signal data     : std_logic_vector (width - 1 downto 0);
+  signal in_busy  : std_logic;
+  signal start_wr : std_logic;
 
   --  Synchronized extended wr_i signal.
-  signal wr_out   : std_logic;
-  --  Internal pulse for wr_o, active one cycle before wr_o.
-  signal wr_out_p : std_logic;
+  signal wr_out         : std_logic;
+  signal last_wr_out    : std_logic;
+  signal wr_out_fb      : std_logic;
+  signal last_wr_out_fb : std_logic;
 begin
   --  Handle incoming request.
   process(clk_in_i)
   begin
     if rising_edge(clk_in_i) then
       if rst_in_n_i = '0' then
-        in_progress <= '0';
+        start_wr <= '0';
         in_busy <= '0';
         data <= (others => '0');
         ack_o <= '0';
+        last_wr_out_fb <= '0';
       else
         ack_o <= '0';
         if in_busy = '0' then
           if wr_i = '1' then
-            in_progress <= '1';
+            --  Write requested.
+            --  Toggle start_wr ...
+            start_wr <= not start_wr;
             in_busy <= '1';
             data <= data_i;
           end if;
         else
           assert wr_i = '0' report "request while previous one not completed"
             severity error;
-          if ack_start = '1' then
-            in_progress <= '0';
-          end if;
-          if ack_done = '1' then
-            assert in_progress = '0';
-            in_busy <= '0';
+          --  ... and wait until wr_out_fb has been toggled.
+          if (wr_out_fb xor last_wr_out_fb) = '1' then
+            --  Set ack (for one cycle).
             ack_o <= '1';
+            last_wr_out_fb <= wr_out_fb;
+            --  Ready for a new request.
+            in_busy <= '0';
           end if;
         end if;
       end if;
@@ -100,9 +102,8 @@ begin
     port map (
       clk_i => clk_out_i,
       rst_n_i => rst_out_n_i,
-      data_i => in_progress,
-      synced_o => wr_out,
-      ppulse_o => wr_out_p);
+      data_i => start_wr,
+      synced_o => wr_out);
 
   --  Outputs.
   process (clk_out_i)
@@ -111,11 +112,13 @@ begin
       if rst_out_n_i = '0' then
         data_o <= (others => '0');
         wr_o <= '0';
+        last_wr_out <= '0';
       else
-        if wr_out_p = '1' then
+        if (wr_out xor last_wr_out) = '1' then
           --  Data are stable.
           data_o <= data;
           wr_o <= '1';
+          last_wr_out <= wr_out;
         else
           wr_o <= '0';
         end if;
@@ -129,6 +132,5 @@ begin
       clk_i => clk_in_i,
       rst_n_i => rst_in_n_i,
       data_i => wr_out,
-      ppulse_o => ack_start,
-      npulse_o => ack_done);
+      synced_o => wr_out_fb);
 end behav;
diff --git a/sim/gc_sync_word_wr/run.do b/sim/gc_sync_word_wr/run.do
index 7dc98e4b87ab8d6484cd9614e52a66b87ed3ab33..fcb88dd73158bb12c543f5938dc67661eadbac63 100644
--- a/sim/gc_sync_word_wr/run.do
+++ b/sim/gc_sync_word_wr/run.do
@@ -11,5 +11,5 @@ radix -hexadecimal
 #add wave *
 do wave.do
 
-run 4 us
+run 400ns
 wave zoomfull
diff --git a/sim/gc_sync_word_wr/wave.do b/sim/gc_sync_word_wr/wave.do
index f4fea1aa0fbb16a3398d867751fe93d7f676e744..417056923d020391fc79969270213102369df075 100644
--- a/sim/gc_sync_word_wr/wave.do
+++ b/sim/gc_sync_word_wr/wave.do
@@ -10,12 +10,11 @@ add wave -noupdate /tb_gc_sync_word_wr/wri
 add wave -noupdate /tb_gc_sync_word_wr/wro
 add wave -noupdate /tb_gc_sync_word_wr/ack
 add wave -noupdate /tb_gc_sync_word_wr/cmp_tb/in_busy
-add wave -noupdate /tb_gc_sync_word_wr/cmp_tb/in_progress
-add wave -noupdate /tb_gc_sync_word_wr/cmp_tb/ack_start
-add wave -noupdate /tb_gc_sync_word_wr/cmp_tb/ack_done
+add wave -noupdate /tb_gc_sync_word_wr/cmp_tb/wr_out
+add wave -noupdate /tb_gc_sync_word_wr/cmp_tb/last_wr_out
 TreeUpdate [SetDefaultTree]
-WaveRestoreCursors {{Cursor 1} {0 ps} 0}
-quietly wave cursor active 0
+WaveRestoreCursors {{Cursor 1} {90000 ps} 0}
+quietly wave cursor active 1
 configure wave -namecolwidth 150
 configure wave -valuecolwidth 100
 configure wave -justifyvalue left
@@ -30,4 +29,4 @@ configure wave -griddelta 40
 configure wave -timeline 0
 configure wave -timelineunits ps
 update
-WaveRestoreZoom {0 ps} {262500 ps}
+WaveRestoreZoom {0 ps} {420 ns}