nabbla (nabbla1) wrote,
nabbla
nabbla1

Category:

QuatCorePC: ложная тревога!

Оказывается, для него это вполне нормальная ситуация, когда RelAddrWidth = RomWidth, например, как сейчас адрес ПЗУ 7-битный, и для записи относительных прыжков тоже надо 7 бит! Я боялся такую ситуацию проверять, был уверен, что верилог грязно выругается, что реверсивный счётчик, который я использую для "верхних бит" стал нулевой ширины.

Но это не так. Сейчас ещё раз глянул в свой код:
//compared to 'old' PCreg, we got rid of reset wire (anyway we rely on initial memory content, so single reset is of little use)
//what's more: instead of full-length adder for relative address, we now have reduced size adder, while senior part of PC should become
//reversive counter. Not exactly sure it's worth it...

//[RelAddrWidth-2:0] : plain simple bits
//[RelAddrWidth-1]: counter enable
//[RelAddrWidth]: counter UP

module QuatCoreLighterPCreg (	input clk, input [15:0] DataBus, input [RomAddrWidth-1:0] CallAddr,
				input [RelAddrWidth:0] RelAddr, input DoCall, input DoAbsAddr,
				output [RomAddrWidth-1:0] Q);

parameter RomAddrWidth = 7;
parameter RelAddrWidth = 7;
localparam CounterWidth = RomAddrWidth - RelAddrWidth + 1;

reg [RelAddrWidth-2:0] PC = 1'b0;

always @(posedge clk)
	PC <= 	DoCall? 	CallAddr[RelAddrWidth-2:0] :
		DoAbsAddr? 	DataBus[RelAddrWidth-2:0] :
				RelAddr[RelAddrWidth-2:0];
						
assign Q[RelAddrWidth-2:0] = PC;
						
lpm_counter Senior (.clock (clk),
		.data (DoCall? CallAddr[RomAddrWidth-1:RelAddrWidth-1] : DataBus[RomAddrWidth-1:RelAddrWidth-1]),
		.sload (DoCall | DoAbsAddr),
		.cnt_en (RelAddr[RelAddrWidth-1]),
		.updown (RelAddr[RelAddrWidth]),
		.Q (Q[RomAddrWidth-1:RelAddrWidth-1]),
		.cout ());
defparam
	Senior.lpm_type = "LPM_COUNTER",
	Senior.lpm_width = CounterWidth;
																		
endmodule


И увидел, что, как это ни странно, если RelAddrWidth = RomWidth = 7, реверсивный счётчик всё-таки создаётся, шириной аж в единицу. Это довольно смешная вещь, однобитный реверсивный счётчик, но, как оказалось, допустимая.


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

Так что попробуем снова отсинтезировать всю "схему в сборе", но в этот раз не побоимся поставить RomWidth=7.

Число логических элементов снизилось с 1004 аж до 1002 :)

Ох, тяжело идёт симуляция 2 миллисекунд работы на частоте 20 МГц на процессоре Intel Atom D510 :) Аж 10 минут на это ушло. Смотрим то место, на котором остановились в прошлый раз:


ДА! Тот факт, что мы точно так же "покрутились" в цикле, намекает на корректную работу относительных прыжков, а теперь и прыжок по абсолютному адресу JMP попал ровно "куда надо", на 0x36.

Там мы начали с непосредственного значения 0x7C, которое превратилось в 0x0C1F = 0000_1100_0001_1111. А к следующему такту оно отправляется в команду ACQ, которой нужны младшие 10 бит (0x01F = 31, т.е "всю строку") и старшие 2 бита (00, что значит никаких синхроимпульсов не дожидаться). Две единицы посерёдке никакой роли не играют, это снова проявление "Undefined Behaviour" нашего компилятора. А вы таблицу из двадцати четырёх 16-битных значений уместить смогли бы в 4 ЛЭ?

И на этом наступает очередная очень длинная пауза: у нас ведь ещё 4 строки ждут своей очереди, в, хм, в ОЧЕРЕДИ или, говоря русским языком, в FIFO.


Ура, прыжок корректный, и первая команда за этим прыжком - тоже :) Из 80 строк кода нам осталось проверить ещё 69 :)
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

  • Нахождение двух самых отдалённых точек

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

  • Слишком общительный счётчик

    Вчера я чуть поторопился отсинтезировать проект,параметры не поменял: RomWidth = 8 вместо 7, RamWidth = 9 вместо 8, и ещё EnableByteAccess=1, чтобы…

  • Балансируем конвейер QuatCore

    В пятницу у нас всё замечательно сработало на симуляции, первые 16 миллисекунд полёт нормальный. А вот прошить весь проект на ПЛИС и попробовать "в…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments