[Oberon] RISC5 implementation issues.

Walter Gallegos walter at waltergallegos.com
Wed Feb 17 23:16:48 CET 2016


Hi Magnus,

You are welcome to continue with FPGA specific topics by private e-mail 
if you want.

Regards
Walter

El 2016-02-17 a las 18:30, Magnus Karlsson escribió:
> Hi Walter,
>
> Since this is really Paul's design, I guess it would be more 
> appropriate to discuss it with him, I was just trying to explain why 
> it looks like it does.
>
> Cheers,
> Magnus
>
>
> On 2/17/2016 1:15 PM, Walter Gallegos wrote:
>> Magnus,
>>
>> Some of messages was delayed; so, I continue from here to not 
>> overload the list.
>>
>> If I understand you correctly, you justify a uncontrolled delay 
>> because they simplify the SRAM handling.
>> Sorry, is as using the old circuit with an and/inverted to generate a 
>> pulse. If you need a delayed signal you should use the DCM 90°, 180° 
>> or 270° clock outputs and keep all under control, I think don't need 
>> a state machine in this case.
>>
>> About ISE warnings, be careful, non warning do not means good 
>> methodology.
>>
>> About XILINX docs; really, I don't remember. Doing training, first as 
>> Xilinx ATP and now as independent consultant, I touch this problem in 
>> my trainings. Have an uncontrolled delay in clock is a big door to 
>> random problems. FPGA design must be synchronous all times; no 
>> exceptions.
>>
>> Regards,
>> Walter
>>
>>
>> El 2016-02-17 a las 14:41, Magnus Karlsson escribió:
>>> Walter,
>>>
>>> I agree with you that the "pure" way of doing this is as you stated, 
>>> with a DCM to directly generate both clk and pclk.  So how come Paul 
>>> didn't do that?  It's not like he doesn't know how to use the DCM, 
>>> after all the current code generates pclk from clk using a DCM, and 
>>> there would probably be less code to do it like you suggest.  No, 
>>> the reason for this is very subtle and is easy to miss if you just 
>>> take a quick look at the code, and it has to the asynchronous SRAM 
>>> interface.
>>>
>>> One of the most critical aspects of using SRAM is to control the 
>>> write signal - ideally the write signal should be asserted after all 
>>> other control signals (like address, data, byte-enable, read, oe) 
>>> are valid, and should be de-asserted well before any of the other 
>>> control signals go invalid, to avoid spurious writes. However, this 
>>> is not that easy to do in a synchronous system where all signals 
>>> change at the clock edge.  The most common way to do this is to have 
>>> a state machine that is clocked at say 4x the CPU clock so that you 
>>> can divided the SRAM access cycle into several phases and assert the 
>>> write signal on some of those phases.
>>>
>>> However, this is not the way Paul choose to do it, instead he choose 
>>> to do a less "pure" clock generation by generating clk from a 
>>> flip-flop rather than from a DCM.  By doing so, he actually 
>>> generates an early version of the clock signal called clk that is 
>>> leading the global clock signal clk_BUFG by the delay of the BUFG 
>>> buffer.  Since this early version of the clock signal is generated 
>>> like any other logic signal, he could use this signal to gate the 
>>> write signal to the SRAM such that write signal will be de-asserted 
>>> well before the other control signals (clocked by clk_BUFG) will 
>>> change, and thus avoiding the need to have a state machine 
>>> controlling the write signal.  The price for this is that the clock 
>>> signal is now generated in a less "pure" way, but still a valid way 
>>> as long as you know what you are doing.  The BUFG clock driver can 
>>> be driven from a PLL, a DCM or from the logic fabric.  The first two 
>>> are speed optimized paths going directly from the PLL or DCM to the 
>>> BUFG and can be clock at much higher clock rate, while the logic 
>>> fabric path is limited by the maximum clock rate of the logic 
>>> fabric.  However, at the clock rate we use (25 MHz) this is not an 
>>> issue.  When you do this there are no warnings generated by ISE that 
>>> this is not a good idea, and I have not read anywhere in the Xilinx 
>>> clocking resource guide that you should avoid doing this. Basically, 
>>> the BUFG clock driver is designed to do this, the tool will allow 
>>> you to do it and at the clock rate we use it has no performance 
>>> implications.  As I see it, this is another place where the goal of 
>>> simplification has driven the implementation of the system at the 
>>> expense of a slightly less "pure" clock generation.
>>>
>>> Just my 2c
>>>
>>> Magnus
>>>
>>>
>>> On 2/17/2016 4:18 AM, Walter Gallegos wrote:
>>>> Hi Paul,
>>>>
>>>> My apologies for this off topic, ProjectOberon is basically a 
>>>> learning tool some hardware comments should not be bad.
>>>>
>>>> Yes the tool add the clock buffers because FF clock edge detectors 
>>>> must be connected to clock distribution tree, this do no correct 
>>>> the issue.
>>>> The problem is, to connect a FF output, as clk signal is, to the 
>>>> clock buffer input the signal need be routed by general propose 
>>>> lines and interconnection matrix. This generate an uncontrolled delay.
>>>> This issue has minor effect in RISC5 because is very special case 
>>>> where all project is self contained.
>>>>
>>>> A correct technique could be, RISC5 use a DCM to generate 75MHZ, 
>>>> use the same DCM to generate both 25MHZ (CLKDV) and 75MHZ (CLKFX) 
>>>> from 50MHZ (CLKIN).
>>>>
>>>> Regards,
>>>> Walter
>>>>
>>>>
>>>> El 2016-02-17 a las 06:39, Paul Reed escribió:
>>>>> Hi Walter,
>>>>>
>>>>>> So, RISC5 use general propose resources to routing a clock signal.
>>>>> I agree with Magnus, the tools add the relevant clock buffer as 
>>>>> part of
>>>>> their job, and the source code is kept simple and clear.
>>>>>
>>>>> FPGAs are a little off-topic for many Oberoners, but hopefully the 
>>>>> below
>>>>> simple hardware LED counter for the Spartan 3 board (easily 
>>>>> adapted to
>>>>> almost any other board!) might be indulged, and interesting for 
>>>>> enough
>>>>> people :)
>>>>>
>>>>> If you create a project in Xilinx ISE for the xc3s200-4ft256 and 
>>>>> add these
>>>>> source files, then "Generate Programming File", then as far as I 
>>>>> can see
>>>>> from the reports, the tools add the appropriate clock buffers and 
>>>>> global
>>>>> resources - correct me if I'm wrong!
>>>>>
>>>>> Cheers,
>>>>> Paul
>>>>>
>>>>>
>>>>> (test.v)
>>>>>
>>>>> `timescale 1ns / 1ps
>>>>>
>>>>> module TestTop(
>>>>>      input CLK50M,   //50MHz
>>>>>      output [7:0] leds);
>>>>>
>>>>> reg clk;
>>>>> reg [31:0] cnt;
>>>>>
>>>>> assign leds = cnt[31:24];
>>>>>
>>>>> always @(posedge clk) //25MHz
>>>>>    cnt <= cnt + 1;
>>>>>
>>>>> always @(posedge CLK50M) clk <= ~clk;
>>>>>
>>>>> endmodule
>>>>>
>>>>> (test.ucf)
>>>>>
>>>>> NET "CLK50M" LOC = "T9" ;
>>>>> NET "leds[0]" LOC = "K12";
>>>>> NET "leds[1]" LOC = "P14";
>>>>> NET "leds[2]" LOC = "L12";
>>>>> NET "leds[3]" LOC = "N14";
>>>>> NET "leds[4]" LOC = "P13";
>>>>> NET "leds[5]" LOC = "N12";
>>>>> NET "leds[6]" LOC = "P12";
>>>>> NET "leds[7]" LOC = "P11";
>>>>>
>>>>>
>>>>> -- 
>>>>> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related 
>>>>> systems
>>>>> https://lists.inf.ethz.ch/mailman/listinfo/oberon
>>>>>
>>>>
>>>
>>> -- 
>>> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related 
>>> systems
>>> https://lists.inf.ethz.ch/mailman/listinfo/oberon
>>>
>>
>
> -- 
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon
>

-- 

Walter Daniel Gallegos
Programmable Logic & Software
Consultoría, Diseño, Entrenamiento.
Montevideo, Uruguay
EMAIL walter at waltergallegos.com
Tel +598 26 23 44 60 | Cel +598 99 18 58 88



More information about the Oberon mailing list