[Open-graphics] Synthesizing oga1hq
Michael Meeuwisse
mickeymeeuw at gmail.com
Tue Aug 14 12:52:13 EDT 2007
On 14 Aug 2007, at 18:27, Timothy Normand Miller wrote:
> Before I do that, let's discuss it. Also, this is really the sort of
> thing that should be discussed on the list, because others need to
> read it too. Please bring this discussion back to the list.
Done. Sorry. :)
> One of the design rules of thumb is to register all of your outputs.
> That is, to the maximum extent possible, outputs from blocks should
> have zero or maybe one level of logic to the port. This is done
> mostly as an aid to the designer -- since most of your combinatorial
> logic is from inputs to registers, you can more easily keep track of
> the prop delays you'll be dealing with.
There's some terminology here which I hopefully correctly understand;
you mean with register x_o and y_o, and port the actual output of
stage2 to the next stage? And because I glued the multiplier to those
registers I'm adding this logic *after* the result has been stored in
the register?
input -(a)--> x_o -(b)--> output
I want to connect the multiplier in phase a, not b, but did b anyhow?
What should I change to connect to a?
> Another rule of thumb, particularly for a pipeline, is to have the
> logic for a given stage to sit in the stage it belongs to. You put
> oga1hq_multiplier in the stage 2 module, but it's really happening in
> stage 3. Architecturally, it's just a big chunk of combinatorial
> logic on the output of a module, which is something we want to avoid.
Rule of thumb != law. But I get your point.
> So, what you've done in your design, if I understand it correctly, is
> put a combinatorial multiplier in stage 2 connected straight to some
> adders you put in stage 3. But there's nothing magical about the
> module hierarchy. It's just how we organized it. And the hierarchy
> doesn't insert registers; you have to do that yourself. So you're not
> actually pipelining anything. You still have one unbroken
> combinatorial chain through the multipler and the adders. This would
> be no faster than the earlier version.
My idea was to not have a straight connection, but have registers in
between. I thought I did that after I defined m_o, but apparently
not? An 'input' or 'output' doesn't linearly map to registers in
verilog?
> If you're thinking about inserting something between the "register
> file" and the registers on the output of stage 2, don't. The
> registers on the output of the file are actually built into the slices
> that implement the file, which is part of our efficiency there. You'd
> actually be switching from a synchronous RAM to an asynchronous one,
> and there's no way we could get that to run at speed.
So input maps directly on output, no buffer there at all? Odd, I
thought VHDL did that all the time. But I'm lost here, what do you
mean with "register file"? :)
> The original suggestion was to have registered multipliers in stage 3
> and then do the adds in stage 4. The output of stage 4 would mux them
> all together on the way into write-back.
How is this different from your earlier rule of thumb? From my
perspective, the mul and add together make up the operation. Wether
we spread it out across stage 2 and 3, or 3 and 4 makes no
difference, right?
> On 8/14/07, Michael Meeuwisse <mickeymeeuw at gmail.com> wrote:
>> Could you try synthesizing attached version? I'm just playing around
>> and don't see what's apparently wrong with my solution (besides that
>> this might not help at all in the lattice due to the dedicated-
>> multiplier-problem).
>>
>> I'll try to get my own Webpack running shortly, but am curious about
>> timing for this file. Hopefully I didn't introduce any compile
>> errors.
>>
>> Mike
>> www.wacco.mveas.com
>>
>>
>>
>
>
> --
> Timothy Normand Miller
> http://www.cse.ohio-state.edu/~millerti
> Open Graphics Project

Mike
www.wacco.mveas.com
-------------- next part --------------
Skipped content of type multipart/mixed
More information about the Open-graphics
mailing list