Завершил механический перенос vm1_qbus.v -> vm1_qbus.cpp
Получилась какая-то страшная каша-малаша в которой совершенно невозможно разобраться, если не иметь перед глазами исходник на верилоге. Теперь надо заново всё сравнить и поискать насчёт опечаток.
Пока наблюдается две проблемы.
1) все assignы не удаётся расположить так, чтобы выполнить их за один проход, придётся крутить их в цикле пока предыдущее состояние wires не станет совпадать с нововычисленным.
2) выходные значения модулей vm1_reg_ff и vm1_timer - wires поэтому как мне кажется, их неправильно будет вызывать при исполнении always, а при исполнении assign их нельзя вызывать, т.к. внутри них есть alwaysы.
Если сделать их выходное значение регистром, а его значения назначать assignом первоначальному wire, логика не нарушится?
например для vm1_reg_ff сделать так:
Код:
assign xr = xr_rc; //тут результат работы vm1_reg_ff
assign yr = yr_rc; //назначается изначальным wire
always @(posedge pin_clk_n) //внутри vm1_reg_ff все always такие же
begin
vm1_reg_ff vreg(
.clk_p(pin_clk_p),
.clk_n(pin_clk_n),
.reset(reset),
.plr(plr),
.xbus_in(x),
.xbus_out(xr_rc),
.ybus_out(yr_rc),
.wstbl(au_alsl),
.wstbh(au_alsh),
.ireg(ir),
.vsel(vsel),
.pa(pin_pa),
.carry(psw[0]));
end
Иначе придётся прямо разворачивать все подмодули как вложения.