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

2 merge or not 2 merge

Всем добра.

Разбираю наследство предшественника, где встретил в RTL коде директиву Quartus (* dont_merge *).

Спойлер
module top(
	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"" *)
	input gen64, // clock 64 MHz

	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"; -name io_maximum_toggle_rate 0; -name WEAK_PULL_UP_RESISTOR ON", useioff = 1 *)
	input resetn, // negedge reset
	
	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"", useioff = 1 *)
	input [9:0] a, // address bus
	
	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"" *)
	inout [15:0] d, // data bus
	
	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"; -name WEAK_PULL_UP_RESISTOR ON", useioff = 1 *)
	input csn, wrn, // data strobes
	
	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"; -name WEAK_PULL_UP_RESISTOR ON" *)
	input rdn, // data strobes
	
//	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"; -name io_maximum_toggle_rate 0;", useioff = 1 *)
	output irq_n,
	
	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"", useioff = 1 *)
	input sample, // sample signal
	
	// Sigma-delta ADC
	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"", useioff = 1 *)
	output [15:0] sd_clk, // clock to modulators
	
	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"; -name WEAK_PULL_UP_RESISTOR ON", useioff = 1 *)
	input [15:0] sd_d // data from modulators
);
	wire clk, sd_clk_2x, adc_clk, pll_locked; // 80, 40, 20 MHz
	
	reg [1:0] reset_reg = '1;
	wire aclr;
	
	reg [1:0] wr_reg = '0, cs_reg = '0;
	reg write_reg = 1'b0, write = 1'b0;
	
	reg [2:0][8:0] addr_reg;
	reg [2:0][15:0] wrdata_reg;
	wire [15:0] rddata;
	
	main_pll	main_pll_inst(.inclk0(gen64), .c0(clk), .c1(sd_clk_2x), .c2(adc_clk), .locked(pll_locked)); // 80 40 20
	
	// Reset
	always_ff @(posedge clk, negedge pll_locked)
		reset_reg <= (!pll_locked) ? ~2'h0 : {reset_reg[0], !resetn};
	
	assign aclr = reset_reg[1];
	
	// AD Bus
	assign d = (!csn && a[9] && !rdn) ? rddata : 16'hZ;
	
	always_ff @(posedge clk, posedge aclr) begin
		wr_reg		<= (aclr) ? '0 : {wr_reg[0], !wrn};
		cs_reg		<= (aclr) ? '0 : {cs_reg[0], !csn && a[9]};	
		write_reg	<= (aclr) ? 1'b0 : cs_reg[1] && wr_reg[1];
		write			<= (aclr) ? 1'b0 : {write_reg, cs_reg[1] && wr_reg[1]} == 2'b01;
	end
	
	always_ff @(posedge clk) begin
		addr_reg <= {addr_reg[1], addr_reg[0], a[8:0]};
		wrdata_reg <= {wrdata_reg[1], wrdata_reg[0], d};
	end
	
	// Sigma-delta clocks
	(* dont_merge *) reg [15:0] sd_clk_reg = '0;
	
	always_ff @(posedge sd_clk_2x, posedge aclr)
		sd_clk_reg <= (aclr) ? 16'h0 : ~sd_clk_reg;
	
	assign sd_clk = sd_clk_reg;
	
	reg [15:0] adc_sdi;
	always @(posedge adc_clk)
		adc_sdi <= sd_d;
	
	main main_inst(
		.aclr, .clk,
		.addr(addr_reg[2]), .wrdata(wrdata_reg[2]), .rddata, .write, .irq_n,
		.sample,
		.adc_clk, .adc_sdi
	);

endmodule :top

 

Штудирование руководства дало следующие:
3.4.17. Disable Register Merging/Don’t Merge Register
This logic option and attribute prevents the specified register from merging with other registers and
prevents other registers from merging with the specified register. When applied to a design entity, it
applies to all registers in the entity.
You can set the Disable Register Merging logic option in the Intel® Quartus® Prime software, or you
can set the dont_merge attribute in your HDL code, as shown in these examples. In these examples,
the logic option or the attribute prevents the my_reg register from merging.

Вопрос: как объяснить желательность (необходимость) применения это атрибута в том или ином случае?

PS. И тут же вопрос: какая необходимость использовать атрибуты портов ввода - вывода к коде, а не в предназначенном для этого *.qsf?
 

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


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

8 minutes ago, Zversky said:

Вопрос: как объяснить желательность (необходимость) применения это атрибута в том или ином случае?

Где то фанаут гнали, точечно

8 minutes ago, Zversky said:

PS. И тут же вопрос: какая необходимость использовать атрибуты портов ввода - вывода к коде, а не в предназначенном для этого *.qsf?
 

я художник, я так вижу

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


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

11 minutes ago, Zversky said:

PS. И тут же вопрос: какая необходимость использовать атрибуты портов ввода - вывода к коде, а не в предназначенном для этого *.qsf?

IMHO наследие далекого прошлого и неудачных экспериментов с кодом в Altera.  

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


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

38 минут назад, des00 сказал:

Где то фанаут гнали, точечно

Не, там в коде всё, что есть: на выводы выходит и всё. Или я что не то понял?

28 минут назад, RobFPGA сказал:

IMHO наследие далекого прошлого и неудачных экспериментов с кодом в Altera. 

Дела давно минувших дней.
Преданья старины глубокой.
(с) не помню, кто и по какому поводу сказал

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


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

3 minutes ago, Zversky said:

Дела давно минувших дней.
Преданья старины глубокой.
(с) не помню, кто и по какому поводу сказал

Слова словесного аса ... А.С. Пушкин  в Руслане и Людмиле 

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


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

Только что, RobFPGA сказал:

Слова словесного аса

Точно. Тут запускал плату с АСЕХ-ом на Quartus 9.0: захотел SystemVerilog скормить. Ага, щас. Пришлось Synplify ставить. Сквозь тернии, как говорится...

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


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

1 hour ago, Zversky said:

Не, там в коде всё, что есть: на выводы выходит и всё. Или я что не то понял?

Если это топ, то все ещё проще. Регистры в порты ввода вывода поставили. И прибили гвоздями, чтобы не вырезали 15 и не повели все с одного делителя. 

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


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

2 часа назад, des00 сказал:

И прибили гвоздями, чтобы не вырезали 15 и не повели все с одного делителя.

Прошу простить мне мою несообразительность, но чем это не комильфо?

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


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

7 hours ago, Zversky said:

Прошу простить мне мою несообразительность, но чем это не комильфо?

разная задержка + ее девиация в температуре

вот только есть у меня ощущение что автор не проверил результат. 

always_ff @(posedge sd_clk_2x, posedge aclr)
		sd_clk_reg <= (aclr) ? 16'h0 : ~sd_clk_reg;
	
	assign sd_clk = sd_clk_reg;

и в выходном триггере нельзя его прочитать обратно, софт варнинг должен был сформировать. Есть конечно вариант обхода через логику входного порта, но не везде софт так делает, сам сброс есть, да. По сути схемы он пытался вытащить чистый клок через эмуляцию DDIO которого на этом чипе похоже нет.  

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


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

6 hours ago, des00 said:

вот только есть у меня ощущение что автор не проверил результат. 

always_ff @(posedge sd_clk_2x, posedge aclr)
		sd_clk_reg <= (aclr) ? 16'h0 : ~sd_clk_reg;
	
	assign sd_clk = sd_clk_reg;

и в выходном триггере нельзя его прочитать обратно, софт варнинг должен был сформировать.

@des00А почему вы считаете, что sd_clk_reg окажется в выходном триггере? В коде это нельзя назначить вроде бы, а только в qsf.

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


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

1 hour ago, ZwergNase said:

@des00А почему вы считаете, что sd_clk_reg окажется в выходном триггере? В коде это нельзя назначить вроде бы, а только в qsf.

	(* altera_attribute = "-name IO_STANDARD \"3.3-V LVCMOS\"", useioff = 1 *)
	output [15:0] sd_clk, // clock to modulators
Quote

Specifying the useioff synthesis attribute to 1 directs the Quartus II software to pack registers into the I/O cells representing the port.

 

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


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

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

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

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

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

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

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

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

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

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