Setting up CW305 with the Picoscope

Hi All,

I want to use the CW305 with the picoscope to capture traces. So far, I have been able to program the FPGA via USB through the Jupyter notebook lab(demos/PA_HW_CW305_1-Attacking_AES_on_an_FPGA.ipynb), however I wasn’t able to progress further through the lab since I set scope=None.

A few questions:

  1. I have one probe of the picoscope connected to TP1 for the trigger and another probe connected to SMA for capturing traces. When using the provided AES bitstream, do I need to modify the bitstream/FPGA design so that the trigger pin TP1 works?

  2. Eventually, I would like to test my own IP core/designs. What is the simplest wrapper interface I would need to add such that I can communicate with the FPGA via USB and python?

Hi,

  1. Yes, you can use TP1 without any modifications. The example bitstream uses IO4 on the 20-pin header as the trigger output, and this is connected to TP1 (see the schematic here).

  2. Have a look at the example AES design (source Verilog files are here and here), and section 8 of http://media.newae.com/appnotes/NAE0010_Whitepaper_CW305_AES_SCA_Attack.pdf. The interface used here is pretty simple; the CW305’s SAM3U provides a register interface for simple reads and writes from Python. It’s an 8-bit data, 21-bit address bus. The register addressing is a bit non-standard (in the way that multi-byte registers are handled) but once you understand how it works it’s very easy to work with, and the easiest way to do that is to run the simple testbench here. Of course there are other ways to do it, but following this approach will work without requiring any changes to the CW305 SAM3U firmware.

And as for the demo notebook, you can connect to the CW305 like this:

import chipwhisperer as cw
target = cw.target(None, cw.targets.CW305, fpga_id='100t', force=False)

any target.XXX calls in the demo will work without a CW scope (e.g. the target.pll setup calls).

What you’ll need to do is adapt the capture_trace() function (defined here) to work with your scope by providing substitutes for the scope.arm(), scope.capture() and scope.get_last_trace() calls.

Let me know if you run into any difficulties.

Jean-Pierre

Hi,
Thanks for your reply! I was able to get the CW305 working with my scope and the example AES design. I am now ready to try one of my own designs.
From my understanding, I can copy clocks.v, cw305_usb_reg_fe.v, cdc_pulse.v into my design, and modify the defines and reg_aes files.

Is that correct?

1 Like

Good to hear! Yes, that’s right.
Jean-Pierre