Success! Subscription added.
Success! Subscription removed.
Sorry, you must verify to complete this action. Please click the verification link in your email. You may re-send via your profile.
This document helps to explain the RTL modifications needed to support fixed patterns of Write data and byte enables in TG 2.0 through the EMIF Debug Toolkit.
The RTL changes are necessary in two files, found under project_name/qii/ed_synth/altera_emif_tg_avl_2_160/synth directory:
The updated altera_emif_avl_tg_2_status_checker.sv and altera_emif_avl_tg_2_traffic_gen.sv files are available here for download: Media:TG2.0_RTL_workaround.zip
This module generates the pass/fail statistics by comparing read data against expected data. The change required is to comment out the following lines shown below, in order to prevent the design from failing when the Test Datamask option has been selected. This change ensures that for a masked byte, the design does not check for a return value of 1 for bits within that byte. The design will therefore, ignore the returned data value for a masked byte.
//else if (byteenable_stage) begin
// pnf_per_bit[bit_num + byte_num * BYTE_SIZE] <= (rdata_rr[bit_num + byte_num * BYTE_SIZE] === 1'b1);
//end
The changes involve bypassing the configured data and byte enables from the EMIF Debug Toolkit GUI and instead directly configuring them in the Verilog code based on the user parameter settings.
This workaround is required for the following configurations:
1. Fixed pattern on Data (All pins and Individual pins case).
2. Byte enables (Default & Test data mask option enabled case - both PRBS and Fixed pattern. Necessary to ensure the desired data bytes
Byte enable pattern:
Parameter "LOAD_BE" - load the byte enable values. Default setting enables all bytes. The width of the value entered for each byte is determined by the parameter "AVL_TO_DQ_WIDTH_RATIO". A value of ‘1’ enables the byte while a value of ‘0’ disables the byte for the corresponding clock cycle. The value of 8’hFF assigned to LOAD_BE ensures data enabled in all the 8 memory clock cycles for the corresponding byte.
// Fixed pattern to load byte enables
parameter LOAD_BE = 8'hFF;
Fixed Data pattern:
Set parameter "FIXED_PATTERN" to either "ALL" or "INDIVIDUAL".
a. "FIXED_PATTERN = ALL” - set the values to the following parameters accordingly.
Following is an example of parameters set for FIXED_PATTERN = “ALL”
parameter FIXED_PATTERN = "ALL";
parameter LOAD_PATTERN = "CUSTOM";
parameter LOAD_CUSTOM = 8'hC3;
b. "FIXED_PATTERN = INDIVIDUAL" - set the value of the entire data bus on parameter "LOAD_DATA_PINS".
For example, for an interface width of 72 data pins, and the ratio of memory clock frequency to user clock frequency is 8, MEM_DATA_WIDTH=72 and AVL_TO_DQ_WIDTH_RATIO=8. The total width of LOAD_DATA_PINS is 72*8= 576.
Data entered in parameter LOAD_DATA_PINS for AVL_TO_DQ_WIDTH_RATIO of 8 is of the format: {[bit0,bit1,bit2 .. bit7] of data bit71,8bit word of data bit70, …8 bit word of data bit1, 8 bit word of data bit 0}br /> Following is an example of parameters to be set for FIXED_PATTERN = “INDIVIDUAL”
parameter FIXED_PATTERN = "INDIVIDUAL";
parameter LOAD_DATA_PINS = 576'hF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0;
The data and byte enables are then assembled and then passed on to the data and byte enable generator logic blocks. The following code snippets show the assembling of the fixed data and byte enable patterns.
wire [7:0] fixed_data;
wire [(DATA_PATTERN_LENGTH*NUMBER_OF_DATA_GENERATORS)-1 : 0] load_data; //576 bits
wire [BYTE_EN_PATTERN_LENGTH-1 : 0] load_be;
// in the “FIXED_PATTERN=ALL” case based on the LOAD_PATTERN chosen for the Fixed pattern, load fixed_data
generate
if ( LOAD_PATTERN == "ONES") begin
assign fixed_data = 8'hFF ;
end else if ( LOAD_PATTERN == "ZEROS") begin
assign fixed_data = 8'h00 ;
end else if ( LOAD_PATTERN == "ONES_ZEROS") begin
assign fixed_data = 8'hAA ;
end else if ( LOAD_PATTERN == "ZEROS_ONES") begin
assign fixed_data = 8'h55 ;
end else if ( LOAD_PATTERN == "CUSTOM") begin
assign fixed_data = LOAD_CUSTOM ;
end else begin
assign fixed_data = 8'hFF;
end
endgenerate
// load_data has the final data based on the selections made earlier.
genvar n;
generate
if (FIXED_PATTERN == "ALL") begin
assign load_data = {(NUMBER_OF_DATA_GENERATORS){fixed_data}};
end else if (FIXED_PATTERN == "INDIVIDUAL") begin
for (n = 0; n < NUMBER_OF_DATA_GENERATORS; n++) begin: fixed_individual_data
assign load_data[(((n+1)*DATA_PATTERN_LENGTH) - 1) : (n*DATA_PATTERN_LENGTH)] = LOAD_DATA_PINS[(((n+1)*DATA_PATTERN_LENGTH) - 1) : (n*DATA_PATTERN_LENGTH)];
end
end else begin
assign load_data = {(MEM_DATA_WIDTH*DATA_RATE_WIDTH_RATIO){1'b1}};
end
endgenerate
//load_be has the final byte enables value
assign load_be = (byte_en_gen_mode[0])? LOAD_BE : (amm_cfg_writedata_r[BYTE_EN_PATTERN_LENGTH-1 : 0]);
The following code snippet shows the byte enables and data being loaded into the data and byte enable generators to the memory. This also needs to be done for the data written to the comparison logic as well.
generate
for (i = 0; i < NUMBER_OF_BYTE_EN_GENERATORS_LOCAL; i = i + 1) begin: gen_wr_byte_en_pppg
altera_emif_avl_tg_2_per_pin_pattern_gen #(
.OUTPUT_WIDTH (DATA_RATE_WIDTH_RATIO),
.PATTERN_LENGTH (BYTE_EN_PATTERN_LENGTH),
.DEFAULT_MODE (1'b1),
.DEFAULT_STATE ({BYTE_EN_PATTERN_LENGTH{1'b1}})
) per_pin_pattern_gen_be(
.clk (clk),
.rst (rst),
.load (byte_en_load[i]),
.load_mode (1'b1),
//Changes to bypass Toolkit values entered for data and byte enables
//.load_data (amm_cfg_writedata_r[BYTE_EN_PATTERN_LENGTH-1:0]),
.load_data (load_be),
.load_inversion (1'b0),
.enable (next_data_write),
.dout (fixed_write_be[i]),
.state_out ()
);
end
endgenerate
generate
//data for comparison to read data
for (i = 0; i < NUMBER_OF_DATA_GENERATORS; i = i + 1) begin: exp_data_pppg
altera_emif_avl_tg_2_per_pin_pattern_gen #(
.OUTPUT_WIDTH (DATA_RATE_WIDTH_RATIO),
.PATTERN_LENGTH (DATA_PATTERN_LENGTH),
//default to prbs pattern mode
.DEFAULT_MODE (1'b0),
.DEFAULT_STATE ({{(DATA_PATTERN_LENGTH-1){1'b0}}, 1'b1})
)
per_pin_pattern_gen_data(
.clk (clk),
.rst (rst),
.load (data_gen_load[i]),
//takes same initial configuration as the write data generators
.load_mode (1'b1),
//.load_data (amm_cfg_writedata_r[DATA_PATTERN_LENGTH-1:0]),
.load_data ((data_gen_mode[0])?(load_data[(i+1)*DATA_PATTERN_LENGTH -1:(i*DATA_PATTERN_LENGTH)]):(amm_cfg_writedata_r[DATA_PATTERN_LENGTH-1:0])),
.load_inversion (1'b0),
.enable (next_read_data_en),
.dout (fixed_exp_write_data[i]),
//only used for passing out initial configuration data through
//this is done by the write data generators
//unnecessary state_out
.state_out ()
);
end
endgenerate
Community support is provided Monday to Friday. Other contact methods are available here.
Intel does not verify all solutions, including but not limited to any file transfers that may appear in this community. Accordingly, Intel disclaims all express and implied warranties, including without limitation, the implied warranties of merchantability, fitness for a particular purpose, and non-infringement, as well as any warranty arising from course of performance, course of dealing, or usage in trade.
For more complete information about compiler optimizations, see our Optimization Notice.