From 40a1a137263715b7d0f17e8a897d79afa75b82b5 Mon Sep 17 00:00:00 2001 From: juehv Date: Wed, 30 Nov 2016 16:02:20 +0100 Subject: update maual test --- test/vhdl_manual/manual_test_ghdl.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/vhdl_manual/manual_test_ghdl.sh b/test/vhdl_manual/manual_test_ghdl.sh index 90ba90b..07b4a9d 100755 --- a/test/vhdl_manual/manual_test_ghdl.sh +++ b/test/vhdl_manual/manual_test_ghdl.sh @@ -9,6 +9,7 @@ # sudo mkdir /opt/ghdl # make # sudo make install +# OR install from https://github.com/tgingold/ghdl/releases/tag/v0.33 ME=`basename $0` DIR="$( cd "$( dirname "$0" )" && pwd )/" @@ -22,7 +23,8 @@ VHDL_OUT=${SIM_DIR}vhd/ SIM_LIB_DIR=${SIM_DIR}scxml/ VHDL_TB_NAME=tb -GHDL=/opt/ghdl/bin/ghdl +#GHDL=/opt/ghdl/bin/ghdl +GHDL=ghdl # get arguments TEST_NUMBER="test144.scxml" -- cgit v0.12 From ff8b0fef70c774bf60cbb822ec378dc999085fde Mon Sep 17 00:00:00 2001 From: juehv Date: Thu, 1 Dec 2016 17:31:58 +0100 Subject: fix spontaneous transition problem when state chart has no events --- src/uscxml/transform/ChartToVHDL.cpp | 28 ++++++++++++++++++---------- test/w3c/ecma/test145.scxml | 2 +- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/uscxml/transform/ChartToVHDL.cpp b/src/uscxml/transform/ChartToVHDL.cpp index 9ef2f75..69ddb67 100644 --- a/src/uscxml/transform/ChartToVHDL.cpp +++ b/src/uscxml/transform/ChartToVHDL.cpp @@ -1102,7 +1102,7 @@ void ChartToVHDL::writeSignalsAndComponents(std::ostream &stream) { stream << "signal int_event_input : std_logic_vector( " << _eventBitSize << " downto 0);" << std::endl; stream << "signal int_event_output : std_logic_vector( " << _eventBitSize << " downto 0);" << std::endl; stream << "signal next_event_re : std_logic;" << std::endl; - stream << "signal next_event_dequeued : std_logic;" << std::endl; + stream << "signal event_dequeued : std_logic;" << std::endl; stream << "signal next_event : std_logic_vector( " << _eventBitSize << " downto 0);" << std::endl; stream << "signal event_consumed : std_logic;" << std::endl; stream << std::endl; @@ -1183,8 +1183,8 @@ void ChartToVHDL::writeSpontaneousHandler(std::ostream &stream) { stream << " if spontaneous_en = '1' then" << std::endl; stream << " spontaneous_en <= optimal_transition_set_combined_sig;" << std::endl; stream << " else" << std::endl; - //if new event is dequeued then 1 else stay 0 - stream << " spontaneous_en <= next_event_dequeued;" << std::endl; + //if new event is dequeued then 1 else stay 0 (but enable it when queue is empty -> spontaneous based state chart) + stream << " spontaneous_en <= event_dequeued or (not event_dequeued and int_event_empty);" << std::endl; stream << " end if;" << std::endl; stream << " end if;" << std::endl; stream << "end process;" << std::endl; @@ -1204,7 +1204,7 @@ void ChartToVHDL::writeInternalEventHandler(std::ostream &stream) { stream << " event_" << escapeMacro((*eventIter)->value) << "_sig <= '0';" << std::endl; } - stream << " next_event_dequeued <= '0';" << std::endl; + stream << " event_dequeued <= '0';" << std::endl; stream << " event_consumed <= '0';" << std::endl; stream << " elsif falling_edge(clk) and stall = '0' then" << std::endl; @@ -1219,7 +1219,7 @@ void ChartToVHDL::writeInternalEventHandler(std::ostream &stream) { } VBranch *tree = (VASSIGN, - VLINE("event_consumed"), + VLINE(" event_consumed"), eventConsumed); tree->print(stream); stream << ";" << std::endl; @@ -1241,14 +1241,14 @@ void ChartToVHDL::writeInternalEventHandler(std::ostream &stream) { stream << "_sig <= '0';" << std::endl; } } - stream << " next_event_dequeued <= '1';" << std::endl; + stream << " event_dequeued <= '1';" << std::endl; } stream << " when others =>" << std::endl; for (std::list::iterator eventIter = _eventNames.begin(); eventIter != _eventNames.end(); eventIter++) { stream << " event_" << escapeMacro((*eventIter)->value) << "_sig <= '0';" << std::endl; } - stream << " next_event_dequeued <= '0';" << std::endl; + stream << " event_dequeued <= '0';" << std::endl; stream << " end case;" << std::endl; stream << " elsif int_event_empty = '1' and event_consumed = '1' then" << std::endl; @@ -1256,7 +1256,7 @@ void ChartToVHDL::writeInternalEventHandler(std::ostream &stream) { eventIter != _eventNames.end(); eventIter++) { stream << " event_" << escapeMacro((*eventIter)->value) << "_sig <= '0';" << std::endl; } - stream << " next_event_dequeued <= '0';" << std::endl; + stream << " event_dequeued <= '0';" << std::endl; stream << " end if;" << std::endl; stream << " end if;" << std::endl; stream << "end process;" << std::endl; @@ -1569,8 +1569,16 @@ void ChartToVHDL::writeSystemSignalMapping(std::ostream &stream) { stream << ";" << std::endl; // tmp mapping for events - stream << "stall <= not en or completed_sig or ( int_event_empty and not spontaneous_en ) ; " << std::endl; - stream << std::endl; +// stream << "stall_handler : process (clk, rst) " << std::endl; +// stream << "begin" << std::endl; +// stream << " if rst = '1' then" << std::endl; +// stream << " stall <= '0';" << std::endl; +// stream << " elsif rising_edge(clk) then" << std::endl; + // empty queue as stall source can arise some issues with state charts just based on spontaneous transitions + stream << " stall <= not en or completed_sig ; --or ( int_event_empty and not spontaneous_en); " << std::endl; +// stream << " end if;" << std::endl; +// stream << "end process;" << std::endl; +// stream << std::endl; // interface signals stream << "-- interface signals" << std::endl; diff --git a/test/w3c/ecma/test145.scxml b/test/w3c/ecma/test145.scxml index b0fdba6..5e9c32b 100644 --- a/test/w3c/ecma/test145.scxml +++ b/test/w3c/ecma/test145.scxml @@ -14,7 +14,7 @@ - + -- cgit v0.12