LINUX.ORG.RU

подскажите как победить тупизм verilatorа?(signal unoptimizable)

 


0

1

есть вот такой код:

`ifndef ADD_V
`define ADD_V

`include "Add1.v"
`include "Add1c.v"

module add(Q, CO, A, B, CI);
	parameter n = 4;
	input  [n-1:0] A;
	input  [n-1:0] B;
	output [n-1:0] Q;
	input          CI;
	output         CO;
	
	wire          [n:0] c;
	genvar         i;
	
	assign c[0] = CI;
	generate
	for( i = 0; i < n; i = i + 2 ) begin
		add1  ap(.Q(Q[i]), .A(A[i]), .B(B[i]),
				 .CI(c[i]), .CO(c[i+1]));
		if (i + 1 < n) begin
			add1c an(.Q(Q[i+1]), .A(A[i+1]), .B(B[i+1]),
			         .CI(c[i+1]), .CO(c[i+2]));
		end
	end
	endgenerate
	
	not n(CO, c[n]);
endmodule   /* add */

`endif
add1 и add1c были нарисованы руками из металла и транзисторов, и потом смоделированы на верилоге. со стороны входов у них затворы транзисторов и никакой кольцевой логики там нет, инфа 100%. а двое их потому что оптимизация с инвертированием сигнала переноса.

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

☆☆☆

Последнее исправление: ckotinko (всего исправлений: 1)

Лучше было бы это вместе с текстом ошибки на electronix.ru том же разместить. Может он просто на неопределенность genvar i; ругается? Пробовали без generate блока руками аналогичное?

Из описания к самому Verilator - It compiles synthesizable Verilog (not test-bench code!).

elrprt
()
Последнее исправление: elrprt (всего исправлений: 1)
Ответ на: комментарий от elrprt

да не, это его известный баг. делается вот так:

wire [2:0] x;

x[0] = f0(...)
x[1] = f1(x[0],...)
x[2] = f2(x[1],...)
а так работает:
wire x0,x1,x2;

x0 = f0(...)
x1 = f1(x0,...)
x2 = f2(x1,...)
ворнинг можно подавить но вдруг кто-то знает как сделать без вектора. я что-то туплю как нагенерить проводов с разными именами.

ckotinko ☆☆☆
() автор топика
Ответ на: комментарий от abacaba

перенести декларации проводов внутрь generate'а

+1, так и делаю в подобных ситуациях

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от ckotinko
module mod_b;
    genvar i;
    for (i=0; i<5; i=i+1) begin: gen_name
            wire w0;
    end

    // reference generated wires
    assign gen_name[0].w0 = value1;
    assign gen_name[1].w0 = value2;
    // ...

endmodule

Но умеет ли это верилятор - без понятия.

abacaba
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.