--- Quote Start ---
I was able to eliminate the latch warnings. Code running on the hardware is still working illogically (or rather not working).
Is this warning a real concern:
Warning (13004): Presettable and clearable registers converted to equivalent circuits with latches. Registers power-up to an undefined state, and DEVCLRn places the registers in an undefined state.
I eliminated this warning on a couple of registers at a lower level. Should I pursue this more?
--- Quote End ---
I've never seen this one, so I suspect your code is just not particular synthesizeable. Create a minimal code example that generates this error, and post it, or just post the section of code you're getting the error with, and members of the forum can review it.
--- Quote Start ---
I also get a bunch of warnings in the timing analysis of this type:
Warning (332060): Node: uart:rs485_port|baud_clk[0] was determined to be a clock but was found without an associated clock assignment.
It seems to occur for every signal that is used as an edge trigger to a always_ff block, like this:
always_ff @ (posedge reset_n, posedge baud_clk[0])
begin
blah,....
end
--- Quote End ---
Right, all 'clocks' need clock constraints. What you want for this one, is the create_generated_clock constraint. Alternatively, you could code your UART to operate at the FPGA clock frequency, and use the baud-rate divider as an enable to that logic. The code ultimately works the same, however, there's one less clock ... but the logic has to operate at a faster clock rate ... Nothing comes for free :)
Older generation FPGAs did not have PLLs and could not route logic element outputs back into the clock network, so your only coding option was to use enable pulses. In your case, creating a slow clock for the UART is fine, you just need to use create_generated_clock to tell TimeQuest the characteristics of that clock.
--- Quote Start ---
Is there a quick and easy way to set up the timing analysis so that it checks things properly?
--- Quote End ---
Not so much 'quick and easy', but you can set it up to properly analyze the timing. The way you are doing it is fine, i.e., iteratively ...
synthesize -> look at warnings -> add constraints -> repeat
Where you repeat until there are no warnings, or at least until you understand why the warnings are occurring and that they can be ignored, eg., signal assigned a value that is not read, and warnings like that.
Cheers,
Dave