Перейти к содержанию
    

Непонятка по altsyncram (альтеровский модуль встроенной памяти)

Приветствую.

 

В некоем проекте (Аррия-10) есть модуль 2хпортовой памяти. Порты синхронны (работают на 1 частоте).

В порт а ведется запись, из порта b производится чтение.

Никаких clock enable нет (=1).

В чем проблема.

Есть в altsyncram параметр: clock_enable_output_b .

И вот при изменении этого параметра (NORMAL или BYPASS) задержка выходных данных при чтении из порта b изменяется на 1 такт 😲.

(при NORMAL - задержка больше).

Прошерстил документацию, и нигде не увидел, чтобы было написано, как этот параметр влияет на задержку и почему.

 

Кто-нибудь может пояснить, что происходит?

 

Всем заранее спасибо.

altsyncram#
(
	.operation_mode   ("DUAL_PORT"),

	////////////////////////////
	// port a parameters //
	////////////////////////////
	.width_a          (18),
	.widthad_a        (10),			
	.numwords_a       (1024),
	// registering parameters
	.outdata_reg_a    ("CLOCK0"),
	// clearing parameters
	
  .address_aclr_a   ("NONE"),						
	.outdata_aclr_a   ("NONE"),	
	.wrcontrol_aclr_a ("NONE"),			
	.indata_aclr_a    ("NONE"),
	.byteena_aclr_a   ("NONE"),

	////////////////////////////
	// port B //
	////////////////////////////
	.width_b                    (18),
	.widthad_b                  (10),
	.numwords_b                 (1024),
	// registering parameters
	.indata_reg_b               ("CLOCK1"),
	.wrcontrol_wraddress_reg_b  ("CLOCK1"),
	.rdcontrol_reg_b  ("CLOCK1"),	
	.address_reg_b    ("CLOCK1"),	
	.outdata_reg_b    ("CLOCK1"),
	.byteena_reg_b    ("CLOCK1"),

	// clearing parameters
	.indata_aclr_b    ("NONE"),
	.wrcontrol_aclr_b ("NONE"),		
	.address_aclr_b   ("NONE"),								
	.outdata_aclr_b   ("NONE"),	
	.rdcontrol_aclr_b ("NONE"),
	.byteena_aclr_b   ("NONE"),

	// byte enable parameters
	.width_byteena_a  (2),
	.width_byteena_b  (2),

	// ram block type choices are )"AUTO"), )SMALL), )MEDIUM) and )LARGE)
	.ram_block_type   ("AUTO"),

	// width of a byte for byte enables
	.byte_size        (9),

	// Mixed port feed through mode choices are
	// OLD_DATA and DONT_CARE
	.read_during_write_mode_mixed_ports ("DONT_CARE"),
	.read_during_write_mode_port_a      ("NEW_DATA_NO_NBE_READ"),
	.read_during_write_mode_port_b      ("NEW_DATA_NO_NBE_READ"),

	// General operation parameters
	.init_file                  ("UNUSED"),
	.init_file_layout           ("PORT_A"),			
	.maximum_depth              (0),			
	.clock_enable_input_a       ("NORMAL"), // choices are normal and bypass not valid for Stratix
	.clock_enable_input_b       ("NORMAL"), // choices are normal and bypass not valid for Stratix	
	.clock_enable_output_a      ("BYPASS"), // choices are normal and bypass not valid for Stratix
	.clock_enable_output_b      ("BYPASS"), // choices are normal and bypass not valid for Stratix	
	.clock_enable_core_a        ("USE_INPUT_CLKEN"),
	.clock_enable_core_b        ("USE_INPUT_CLKEN"),
	.enable_ecc                 ("FALSE"),
	.ecc_pipeline_stage_enabled ("FALSE"),
	.width_eccstatus            (3),
	.intended_device_family     ("Arria V")//,
	//.cbxi_parameter             ("NOTHING")
)
altsyncram0
(
	.aclr0  (Reset),//					  = 0,
	//.aclr1  (Reset),//					  = 0,
  .aclr1  (0),//					  = 0,

	.clock0     (Clk),//				  = 1,
	.clocken0   (ClkEna0),//			  = 1,

  .address_a  (WrAddr ),//       = 0,
	.rden_a     (1'b0   ),//				  = 1,
	.q_a        (),  
	.data_a     (WrData ),//          = 1, 
	.wren_a     (WrEna  ),//  = 0,  
	.byteena_a  (2'b11  ),//       = 1,
  
	.clock1     (Clk),//				  = 1,
	.clocken1   (ClkEna1),//			  = 1,
	.address_b  (RdAddr ),//       = 1,
	.rden_b     (1),//				  = 1,
	.q_b        (RdData ),
	.data_b     (),//          = 1,
	.wren_b     (0),
  .byteena_b  (0)//       = 1,
);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а если в Technology mapper посмотреть инстанцированную память и ее параметры и сравнить с документацией?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Koluchiy said:

Посмотрю. Вообще, сейчас это чисто симуляторный проект (Questa).

аа, ну дык это простож решается, модель altsyncram идет в сорцах, посмотрите что там происходит. Там обычный верилог, может быть у вас какие нить гонки возникают и что нить типа вот этого 

    assign i_outlatch_clken_b              = ((clock_enable_output_a == "NORMAL") && (outdata_reg_b == "UNREGISTERED") && 
											(operation_mode == "BIDIR_DUAL_PORT") && (family_has_stratixv_style_ram == 1))?
											(((address_reg_b == "CLOCK0") && (outdata_reg_a == "CLOCK0")) ? clocken0 : 
											(((address_reg_b == "CLOCK1") && (outdata_reg_a == "CLOCK1")) ? clocken1 : 1'b1))
											: 1'b1;

не совсем корректно обрабатывается) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...