VHDL Recursion and Useful Error Messages
If hardware designers are to be more productive, the tools need to be better. Instead of building more complex tools (think: ESL and the likes) the EDA vendors should keep an appropriate focus on basic usability. Because, as Richard Goering says, just because it doesn't crash doesn't mean "quality."
I just lost two hours struggling with VHDL simulators, while in fact I wrote a silly error in my VHDL code. If I write a simple VHDL error, I expect a simple error message. Now, the error I made was a function call with infinite recursion. Granted, most VHDL designers avoid recursion all together, but that is beside the point. Recursion makes it easy to express an algorithm, and is is fully supported in the VHDL standard. There should be no reason to avoid it (at least not in behavioral code).
Proper behavior
Other languages provide decent error messages when you write infinite recursion:
def foo(x): return foo(x-1) foo(5)
Running this code in Python will get you a long stack trace that ends with:
File "test.py", line 2, in foo RuntimeError: maximum recursion depth exceeded
After reading this, any 16 year old would think: "Hm, I might have hit the maximum recursion depth, perhaps there is something wrong with my recursive function foo in line 2." Problem fixed in 30 seconds or less.
Other languages use terms like "stack overflow", which is a bit more abstract, but still easy to understand for any trained programmer or any kid with access to an online search engine.
Confusing behavior
I did a similar thing in VHDL. I wrote a textbook algorithm, the factorial function, using recursion. I wrote a small error which caused the function to recurse infinitely. Silly me.
The tools, however, were not helpful. Mentor Graphics Modelsim just froze. That gives me very little information. I didn't know whether there was a bug in Modelsim, if my system was set up incorrectly or if there was an error in my design. That's a lot of place to look for an error.
I couldn't help but try the same on Xilinx ISim. ISim did not freeze, but its error message was less than helpful:
ISim log file Running: /home/philippe.faes/workspace-sigasi/factorial/factorial -gui -tclbatch isim.cmd INFO: There is another simulation running in the same directory. Using database file name isim1.wdb. ISim M.70d (signature 0x61e1bd6e) WARNING: A WEBPACK license was found. WARNING: Please use Xilinx License Configuration Manager to check out a full ISim license. WARNING: ISim will run in Lite mode. Please refer to the ISim documentation for more information on the differences between the Lite and the Full version. This is a Lite version of ISim. Time resolution is 1 ps # wave add fac_tb # run all Simulator is doing circuit initialization process. Finished circuit initialization process. The simulator has terminated in an unexpected manner. Please review the ISim log (isim.log) for details.
So, let's look at isim.log, then. Oh no, that was isim.log! I expect you'd agree: there is ample room for improvement in the error messages.
Call to action
But according to the No Complaining Rule, only constructive complaints are allowed. So, here is a way for you to help me solve this.
If you run in to cryptic error messages like this, please report them to your tool vendor. It is your right and your duty towards yourself and your fellow hardware designers. This is the only way the quality of your tools is going to increase.
Disclaimer
Sigasi is not without sin either. We try to make our software user friendly, but sometimes we fail. Please let us know!
Comments
Got a bug in your Python
Got a bug in your Python source there...
Amen on your point though. The quality of your feedback loop is directly correlated with the quality of the output.
Thanks. Fixed it in the text!
Thanks. Fixed it in the text!
I use recursion in VHDL as
I use recursion in VHDL as much as possible, even if I could do the same with a simple for loop. Recursion usually produces very nice RTL diagrams which are easier to understand. Most of the times it also produces faster logic as you often get a 'binary tree'- type solution. The only drawback is that recursion can only be done with a function making the synthesised logic pure combinatorial,which can not be pipelined.
I do use Altera's Quartus II however, and get a stack error message if I forget or mess up the necessary 'how to stop' code.