Difference between revisions of "System deployment"

From NaplesPU Documentation
Jump to: navigation, search
(Memory Controller)
(Memory Controller)
Line 29: Line 29:
 
  output logic [7:0]                  axi_awlen,  // Write Burst Length
 
  output logic [7:0]                  axi_awlen,  // Write Burst Length
 
  ...
 
  ...
 
 
Then, the MIG turns incoming AXI requests into DDR transactions forwarded to memory blocks located on the board.
 
Then, the MIG turns incoming AXI requests into DDR transactions forwarded to memory blocks located on the board.
  
 +
The ''memory_controller'' also generates the memory availability bit. It instantiates a FIFO ''input_fifo'' in which incoming requests from the ''nuplus_system'' are stored:
 +
sync_fifo #(
 +
  .WIDTH                ( 32 + 64 + 512 + 1 + 1 ),
 +
  .SIZE                  ( 2 ),
 +
  .ALMOST_FULL_THRESHOLD ( 1 )
 +
) input_fifo (
 +
  .clk          ( clk ),
 +
  .reset        ( reset ),
 +
  .flush_en    ( 1'b0 ),
 +
  .full        ( ),
 +
  .almost_full  ( input_fifo_almost_full ),
 +
  .enqueue_en  ( blk_request_read | blk_request_write ),
 +
  .value_i      ( {blk_request_address, blk_request_dirty_mask, blk_request_data, blk_request_read, blk_request_write} ),
 +
  .empty        ( input_fifo_empty ),
 +
  .almost_empty ( ),
 +
  .dequeue_en  ( fifo_blk_dequeue ),
 +
  .value_o      ( {fifo_blk_request_address, fifo_blk_request_dirty_mask, fifo_blk_request_data, fifo_blk_request_read, fifo_blk_request_write} )
 +
);
 +
The availability signals is deasserted when ''input_fifo'' has an element stored:
 +
 +
assign mc_available = ~input_fifo_almost_full;
 +
  
 
  // Command interface
 
  // Command interface

Revision as of 17:38, 14 May 2019

TODO: descrizione uart_router, memory_controller, con riferimento a template nexys4ddr, (comandi, console) e memoria, disegno/schema, interazione con host, loading memoria, avvio kernel

The Single core version has been deployed on a Nexys4DDR FPGA board, modules involved are located into boards/nexys4ddr and src/deploy/ folders. The design interconnects the board DDR memory and the UART respectively to the Memory and Item interfaces. The figure below shows a schematic block of the top module:

Nexys4DDR.jpg

The nuplus_system lays on the middle of the design, while uart_router and memory_controller translate nu+ transactions letting the system communicate with both the host (through the UART) and with the board memory (through the DDR interface).

Memory Controller

da AXI a DDR The memory controller deployed in the current release translates incoming memory requests on the Memory Interface into AXI transactions, forwarded to the MIG IPCore instantiated into the design. The memory_controller provides to the nuplus_system a block interface compliant with the core Memory Interface:

// Block interface
input  logic [31 : 0]               blk_request_address,
input  logic [63 : 0]               blk_request_dirty_mask,
input  logic [511 : 0]              blk_request_data,
input  logic                        blk_request_read,
input  logic                        blk_request_write,
output logic                        mc_available,
output logic                        mc_response_valid,
output logic [31 : 0]               mc_response_address,
output logic [511 : 0]              mc_response_data,
input  logic                        blk_available,

Turning nu+ memory requests into AXI transactions:

// AXI write address channel signals
input                               axi_awready, // Indicates slave is ready to accept
output logic [3:0]                  axi_awid,    // Write ID
output logic [31:0]                 axi_awaddr,  // Write address
output logic [7:0]                  axi_awlen,   // Write Burst Length
...

Then, the MIG turns incoming AXI requests into DDR transactions forwarded to memory blocks located on the board.

The memory_controller also generates the memory availability bit. It instantiates a FIFO input_fifo in which incoming requests from the nuplus_system are stored:

sync_fifo #(
 .WIDTH                 ( 32 + 64 + 512 + 1 + 1 ),
 .SIZE                  ( 2 ),
 .ALMOST_FULL_THRESHOLD ( 1 )
) input_fifo (
 .clk          ( clk ),
 .reset        ( reset ),
 .flush_en     ( 1'b0 ),
 .full         ( ),
 .almost_full  ( input_fifo_almost_full ),
 .enqueue_en   ( blk_request_read | blk_request_write ),
 .value_i      ( {blk_request_address, blk_request_dirty_mask, blk_request_data, blk_request_read, blk_request_write} ),
 .empty        ( input_fifo_empty ),
 .almost_empty ( ),
 .dequeue_en   ( fifo_blk_dequeue ),
 .value_o      ( {fifo_blk_request_address, fifo_blk_request_dirty_mask, fifo_blk_request_data, fifo_blk_request_read, fifo_blk_request_write} )
);

The availability signals is deasserted when input_fifo has an element stored:

assign mc_available = ~input_fifo_almost_full;

// Command interface
input  [31:0]                       command_word_i,
input                               command_valid_i,
output logic                        command_ready_o,
output logic [31:0]                 command_word_o,
output logic                        command_valid_o,
input                               command_ready_i,

Host interaction

Uart controller e traduzione in items per nu+ (da uart_router)

Console commands

uart_loader.py

Starting a Kernel