[Cryptech Tech] [Cryptech-Commits] [core/platform/novena] 21/21: Sick hacks to compensate for sparse MUX within TRNG core.

Pavel Shatov meisterpaul1 at yandex.ru
Thu Oct 1 20:28:37 UTC 2015


On 01.10.2015 15:32, Joachim Strömbergson wrote:
>
> Most of our HW design has async active low reset (all hash cores, aes,
> cha, trng, entropy providers, parts of eim etc). The big one that does't
> do this is modexp6s.

If you look carefully, you'll see, that this core doesn't have a reset 
signal at all, reset is only used in the wrapper module. I see, that we 
have two voices for active-low and one for active-high. Joachim, can you 
rewrite the wrapper for modexps6 or do you want me to modify it for 
active-low?

>And eim arbiter actually has async
> active high reset, even though the signal is called "eim_cs0_n".

Wait, the signal eim_cs0_n is chip select, and it is indeed active-low. 
Now EIM arbiter has an FSM, that should be reset, when FPGA is 
deselected (i.e. eim_cs0_n == 1'b1), that is why there is posedge in 
that module. Well, I think you can treat this signal as an active-high 
reset, but it is specific to EIM arbiter module, it should not be used 
anywhere else.

> Since we have previously gone for async active low and by far most of
> our design uses this strategy, I propose that we use async active low
> reset (with synch deassertion). Where platform specific FPGA macros
> require something different we solve that in each case, preferably in a
> wrapper.

Joachim, one more important thing to consider is the clock manager 
module. We have a PLL there, so we must wait for it to lock before 
releasing reset. PLL has an active-high output named LOCKED. In theory 
this signal can be directly used as reset, but I remember, that doing so 
gives very weird timing issues, that's why I added a synchronizer there. 
This synchronizer looks like Fig.7 from this document:

http://www.xilinx.com/support/documentation/white_papers/wp272.pdf

where Asynchronous_Reset is in fact LOCKED output of PLL.

Right now `sys_rst' (which is generated by clock manager) behaves 
exactly as you want: it gets asserted asynchronously whenever PLL has no 
lock, and then released synchronously. The only problem is polarity, 
since I coded it to be active-high. To convert it to active-low, you 
need to preload the shift with register with zeroes instead of ones, and 
feed 1 instead of 0 into the first flip-flip. Do you want me to modify 
novena_clkmgr.v or you can handle this yourself?

--
With best regards,
Pavel Shatov


More information about the Tech mailing list