You're right about the extra bit for a full-range multiply, but I handled that problem by generating the LUT to go from -127 to 127.
The problem gets weirder though... it synthesesizes and runs correctly in hardware if the input vars are registers:
reg signed ri;
reg signed rq;
dacfull=(ri*cos)-(rq*sin);
dacval=(dacfull/64)+512;
I set ri and rq in the initial to exactly the same values I set i and q to in the top-level module. Using the registers like that, the synth figures out that I need multiplication (which it never did without the registers):
Info (278003): Inferred multiplier megafunction ("lpm_mult") from the following logic: "iqmod:myiq|Mult0"
But here's the weird part: if I set ri and rq to i and q anywhere, it does the same thing it did before: no multiplier infered, and dacval is always 0. I tried "ri=i; rq=q;" just above the math lines, as well as adding a separate block @(i,q) where the registers are set, and both ways fail.
I verified throughout the code that i+q are exactly the same type as ri and rq (signed 8-bit registers), except ri and rq are defined in this module and i and q are defined in the above level. What am I missing?