Introduction
Recently a student of mine asked me to review her Verilog code because she had
problems and could not find how the error was originated. Obviously, the
synthesis tool used generated an error message, and obviously that message did
not give any idea of what was the source of the problem. The first thing I
did, and that sometimes works for me, is to synthesize the code into the tool
of competition (X or A), and .... the result was the same: encrypted error
message. The second thing that I usually do in these cases is "google"
the error message. I did that and I found nothing ! ... I had no other choice
but to study the issue and try to find out the source of the error.
Below you can find details of the problem, error messages and finally the solution ....
Below you can find details of the problem, error messages and finally the solution ....
Encrypted messages Error
ISE generates the following error message:
"ERROR:Xst:904 - "../../RTL_Src/semaforo.v" line 64: An edge descriptor must be applied to an expression of size 1."
The Quartus' error message:
The lines of code corresponding to the line number indicated by the error message are:
"ERROR:Xst:904 - "../../RTL_Src/semaforo.v" line 64: An edge descriptor must be applied to an expression of size 1."
The Quartus' error message:
"Error (10200): Verilog HDL Conditional Statement error at
semaforo.v(64): cannot match operand(s) in the condition to the corresponding
edges in the enclosing event control of the always construct"
The lines of code corresponding to the line number indicated by the error message are:
At first sight, there is nothing wrong with the code. I checked each
statement of these lines, every symbol, every name many times and everything
looked perfectly fine.
Another thing I did it was to go to the reference error message generated by the tool. When using ISE the error is Xst ISE: 904:
Another thing I did it was to go to the reference error message generated by the tool. When using ISE the error is Xst ISE: 904:
when you double-click on the link of the error, the following message
shows up in ISE:
Does it helps the 'help' ?.... nooooo !!!
Quartus directly had no link or further explanation of the error message itself.
Quartus directly had no link or further explanation of the error message itself.
Well, after many workarounds; as always, the solution was very simple. Actually the problem was not in the code itself, but in the definition of clk and rst.
These are the first lines of code where E / S are defined:
Can you find the problem ? .....
PROHIBITED continuing reading before finding the error .... :)
Just for saving a few lines of code, clk and rst were defined in the same line as the two bits vectors sensor and button .... so clk and rst are actually defined as vectors of two bits, so the instruction negedge or posedge can not determine which edge to execute.
As usual, once one found the error, one says: "How come I can’t find it sooner!", "How easy is the solution !", etc. etc ... What I did find strange is that compilers can not generate a simpler error message, with a better indication of the problem and a better guide to the solution.
Well, I hope you find this article useful.