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

Нуждаюсь в советах по констрейнам

Меня очень смущают такие конструкции:

(continuous assignment)

always @(posedge SysWrite or negedge Reset) 
begin
    LoadSecond[31:0]=SysDin[31:0];
end

 

Я бы рекомендовал писать

(procedural assignment)

always @(posedge SysWrite or negedge Reset)
begin
    LoadSecond[31:0]<=SysDin[31:0];
end

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


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

Меня очень смущают такие конструкции:

always @(posedge SysWrite or negedge Reset) 
begin
    LoadSecond[31:0]=SysDin[31:0];
end

Это не совсем "синхронный" дизайн....

Я бы настоятельно рекомендовал писать

always @(posedge SysWrite) 
begin
    LoadSecond[31:0]<=SysDin[31:0];
end

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

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


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

Да, я поправил, не в этом суть моего поста.

 

А откуда берется 1 Mhz pulse?

(Clock1 то есть)

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


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

Привожу пример откуда он такие клоки откапывает

пожалуйста пользуйтесь тегами для оформления кода. У вас видна асинхронная шина, в принципе можно сделать и так (если понимать к чему может это привести) это один клок, где другие 9 ?

 

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

тут как раз именно латч и по описанию и по мнению XSТ

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


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

Да, я поправил, не в этом суть моего поста.

 

А откуда берется 1 Mhz pulse?

(Clock то есть)

это строб, длиной в период клока появляется 1 раз за микросекунду. Тактируется тем же клоком. Создается в другом месте, так как используется в нескольких местах. Я привел этот модуль не потому что он не работает (он продолжает работать). А в качестве примера откуда берутся клоки того расстрельного списка 10 необьявленных клоков. Синтезатор здесь видит какой то клок : (*) These 10 clock signal(s) are generated by combinatorial logic,

 

пожалуйста пользуйтесь тегами для оформления кода. У вас видна асинхронная шина, в принципе можно сделать и так (если понимать к чему может это привести) это один клок, где другие 9 ?

 

 

тут как раз именно латч и по описанию и по мнению XSТ

 

Latch With Positive Gate Verilog Coding Example

//

// Latch with Positive Gate

//

module v_latches_1 (G, D, Q);

input G, D;

output Q;

reg Q;

always @(G or D)

begin

if (G)

Q = D;

end

endmodule

 

Я очень уважительно отношусь к синтезатору альтеры то есть к квартусу. Если откомпилить данный файл в нем, то увидим, что там именно мультиплексор

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


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

Я очень уважительно отношусь к синтезатору альтеры то есть к квартусу. Если откомпилить данный файл в нем, то увидим, что там именно мультиплексор

а я стараюсь внимательно читать приводимый код и пользоваться тегами для его оформления

assign SysDout[31:0]=MuxInt(SysAddr, Second, Microsecond);

function [31:0] MuxInt;
  input [7:0] Addr;
  input [31:0] Second;
  input [31:0] Microsecond;

  case (Addr)
    ADDR_SECOND : MuxInt[31:0]=Second[31:0];
    ADDR_MICROSECOND : MuxInt[31:0]=Microsecond[31:0];

    ADDR_FPGA_SERIES : MuxInt[31:0]=FPGA_SERIES;
    ADDR_FPGA_LCELS : MuxInt[31:0]=FPGA_LCELS;
    ADDR_FPGA_SPEED : MuxInt[31:0]=FPGA_SPEED;

    ADDR_PRODUCER : MuxInt[31:0]=PRODUCER;

    ADDR_FIRMVARE_NAME : MuxInt[31:0]=FIRMVARE_NAME;
    ADDR_FIRMVARE_VER : MuxInt[31:0]=FIRMVARE_VER;

    ADDR_DEVELOPER : MuxInt[31:0]=DEVELOPER;
  endcase //Addr
endfunction //MuxIicDataIn

чему будет равно SysDout[31:0] когда SysAddr не равен ни одному из сигналов ?

 

ЗЫ. Не надо считать XST тупым, если он пишет что он нашел latch, то это значит что именно его он и нашел.

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


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

мультиплексоры можно написать по разному. И ксалинкс их очень плохо переваривает. Я уже по этому поводу раньше открывал тему. Ша приведу пример

Multiplexers Case Statement Examples

Following are three examples of Case statements:

• “Full and Parallel Case Statement Example”

• “Not Full But Parallel Case Statement Example”

• “Neither Full Nor Parallel Case Statement Example”

Full and Parallel Case Statement Example

module full (sel, i1, i2, i3, i4, o1);

input [1:0] sel;

input [1:0] i1, i2, i3, i4;

output [1:0] o1;

reg [1:0] o1;

always @(sel or i1 or i2 or i3 or i4)

begin

case (sel)

2'b00: o1 = i1;

2'b01: o1 = i2;

2'b10: o1 = i3;

2'b11: o1 = i4;

endcase

end

endmodule

 

посмотрите что нарисует ртл схематик.

 

ЗЫ. Не надо считать XST тупым, если он пишет что он нашел latch, то это значит что именно его он и нашел.

 

пропустил строчку

default : MuxInt[31:0]=32'd0;

 

Спасибо добавлю и отчитаюсь-перестал он его как латч видеть. Но факт остается фактом-квартум это сьедает на ура как мукс.

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


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

это строб, длиной в период клока появляется 1 раз за микросекунду. Тактируется тем же клоком. Создается в другом месте, так как используется в нескольких местах. Я привел этот модуль не потому что он не работает (он продолжает работать). А в качестве примера откуда берутся клоки того расстрельного списка 10 необьявленных клоков. Синтезатор здесь видит какой то клок : (*) These 10 clock signal(s) are generated by combinatorial logic,

Синтезатор правильно видит здесь какой-то клок. Это как раз та конструкция которую я вам приводил в первом посте.

Вы под одним клоком формируете сигнал (имеется ввиду строб Clock1), который подается на вход тактовой другого регистра (имеются ввиду Second,Microsecond ). Вот собственно и источник надписи в отчете синтезатора. :)

 

Предполагая, что строб Clock1 сформирован под тактовой SysWrite я бы предложил сделать так:

always @(posedge SysWrite ...)
    ...
    if ((Load == 1'b1) && (Clock1 == 1'b1) && ... )
        Second[31:0]<=LoadSecond[31:0];
    ...

Тогда многоуважаемый синтезатор будет "понимать", что от изменения Clock1 до его "использования" один такт SysWrite. А сейчас этого "не видно".

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


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

посмотрите что нарисует ртл схематик.

вам шашечки или ехать? я предлагаю вам последовательно устранять косяки в вашем коде и выяснить что не работает. Если не хотите это ваше дело. Ройте дальше. :)

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


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

Но проблема не в этом модуле. А в других, где идут потоки данных. Там таких муксов нет

 

вам шашечки или ехать? я предлагаю вам последовательно устранять косяки в вашем коде и выяснить что не работает. Если не хотите это ваше дело. Ройте дальше. :)

см выше-я вам ответил вполне адекватно. Но почему то сообшение не туда вставилось

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


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

Но проблема не в этом модуле. А в других, где идут потоки данных. Там таких муксов нет

помимо этого еще есть какой то 8ми битный латч в вашем коде, помимо этого устраните/опишите те 10 клоков. Сбоить может все что угодно. Надо последовательно приводить схему в синхронное состояние, что бы STA выдавал правду.

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


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

Я бы посоветовал устранить подобные тактовые сигналы, где это возможно. Есть ли такие в проблемных модулях?

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


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

Синтезатор правильно видит здесь какой-то клок. Это как раз та конструкция которую я вам приводил в первом посте.

Вы под одним клоком формируете сигнал (имеется ввиду строб Clock1), который подается на вход тактовой другого регистра (имеются ввиду Second,Microsecond ). Вот собственно и источник надписи в отчете синтезатора. :)

 

Предполагая, что строб Clock1 сформирован под тактовой SysWrite я бы предложил сделать так:

always @(posedge SysWrite ...)
    ...
    if ((Load == 1'b1) && (Clock1 == 1'b1) && ... )
        Second[31:0]<=LoadSecond[31:0];
    ...

Тогда многоуважаемый синтезатор будет "понимать", что от изменения Clock1 до его "использования" один такт SysWrite. А сейчас этого "не видно".

он там совсем другой сигнал в список клоков засунул а не клок1

 

Я бы посоветовал устранить подобные тактовые сигналы, где это возможно. Есть ли такие в проблемных модулях?

устраняю. Но в этом списке 10 клоков нет клоков-откуда он их откопал, ша разбираюсь. Вставляю в муксы default. Посмотрим уменьшится ли количество этих так называемых клоков. Хотя большинство не имеют отношения к данным-тока в управление

 

Все- осталось 4 грешных клока:

 

TIMING REPORT

 

NOTE: THESE TIMING NUMBERS ARE ONLY A SYNTHESIS ESTIMATE.

FOR ACCURATE TIMING INFORMATION PLEASE REFER TO THE TRACE REPORT

GENERATED AFTER PLACE-and-ROUTE.

 

Clock Information:

------------------

-------------------------------------------------------------+-------------------------------------------------------+-------+

Clock Signal | Clock buffer(FF name) | Load |

-------------------------------------------------------------+-------------------------------------------------------+-------+

BusSpiSck | IBUF | 58 |

BusRxClock_p | IBUFDS+BUFG | 7186 |

spi_to_epc/Write | NONE(timer/LoadMicrosecond_31) | 2548 |

BusRxClock_p | clock_gen/dcm/DCM_INST:CLK0 | 272 |

SramCq | sram/read_clock/dcm/DCM_INST:CLK0 | 108 |

Phy0RxClk | IBUFG+BUFG | 356 |

mac_0/mac/mac_rx/mac_rx_ff/write/Packet_number_add | NONE(mac_0/mac/mac_rx/mac_rx_ff/Packet_number_add_reg)| 1 |

Phy0TxClk | IBUF | 1 |

mac_0/mac/rmon/ctrl/CPU_rd_apply_reg | NONE(mac_0/mac/regs_int/RmonDout_0) | 32 |

mac_0/mac/regs_int/RmonReadx(mac_0/mac/regs_int/RmonReadx1:O)| NONE(*)(mac_0/mac/regs_int/short_impulse/a) | 1 |

Phy1RxClk | IBUFG+BUFG | 356 |

mac_1/mac/mac_rx/mac_rx_ff/write/Packet_number_add | NONE(mac_1/mac/mac_rx/mac_rx_ff/Packet_number_add_reg)| 1 |

Phy1TxClk | IBUF | 1 |

mac_1/mac/rmon/ctrl/CPU_rd_apply_reg | NONE(mac_1/mac/regs_int/RmonDout_0) | 32 |

mac_1/mac/regs_int/RmonReadx(mac_1/mac/regs_int/RmonReadx1:O)| NONE(*)(mac_1/mac/regs_int/short_impulse/a) | 1 |

Phy2RxClk | IBUFG+BUFG | 356 |

mac_2/mac/mac_rx/mac_rx_ff/write/Packet_number_add | NONE(mac_2/mac/mac_rx/mac_rx_ff/Packet_number_add_reg)| 1 |

Phy2TxClk | IBUF | 1 |

mac_2/mac/rmon/ctrl/CPU_rd_apply_reg | NONE(mac_2/mac/regs_int/RmonDout_0) | 32 |

mac_2/mac/regs_int/RmonReadx(mac_2/mac/regs_int/RmonReadx1:O)| NONE(*)(mac_2/mac/regs_int/short_impulse/a) | 1 |

Phy3RxClk | IBUFG+BUFG | 356 |

mac_3/mac/mac_rx/mac_rx_ff/write/Packet_number_add | NONE(mac_3/mac/mac_rx/mac_rx_ff/Packet_number_add_reg)| 1 |

Phy3TxClk | IBUF | 1 |

mac_3/mac/rmon/ctrl/CPU_rd_apply_reg | NONE(mac_3/mac/regs_int/RmonDout_0) | 32 |

mac_3/mac/regs_int/RmonReadx(mac_3/mac/regs_int/RmonReadx1:O)| NONE(*)(mac_3/mac/regs_int/short_impulse/a) | 1 |

-------------------------------------------------------------+-------------------------------------------------------+-------+

(*) These 4 clock signal(s) are generated by combinatorial logic,

and XST is not able to identify which are the primary clock signals.

Please use the CLOCK_SIGNAL constraint to specify the clock signal(s) generated by combinatorial logic.

INFO:Xst:2169 - HDL ADVISOR - Some clock signals were not automatically buffered by XST with BUFG/BUFR resources. Please use the buffer_type constraint in order to insert these buffers to the clock signals to help prevent skew problems.

 

Так как они относятся к сбору статистики то на них можно пока забить. Они не относятся с проблемной части

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


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

Так это все таки был Clock1 или что-то другое?

А проблемы остались? Еще можно пристально посмотреть на (spi_to_epc/Write)... он там ничем "нужным" не управляет?

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


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

А тот 8-битный латч из той же серии - забыл define в мультиплексоре. Латчей больше синтезатор не видит. Привожу новый репорт. Те 4 клока-на них можно не обращать внимания-потом исправлю

 

Так это все таки был Clock1 или что-то другое?

А проблемы остались? Еще можно пристально посмотреть на (spi_to_epc/Write)... он там ничем "нужным" не управляет?

Вот вы привязались к этому клоку :) Он не присутствует в этом расстрельном списке клоков

Привожу файл

 

`timescale 1ns / 1ps

//

module clock_gen (

BusReset, Reset, Clock125, Clock125_90, Clock1,

Clock125Ena, Mac0ClockEna, Mac1ClockEna, Mac2ClockEna, Mac3ClockEna,

SramAccess, SramAccessSel,

BusRxClock_p, BusRxClock_n,

BusTxClock_p, BusTxClock_n);

 

// Global

input BusReset; //active high

output Reset; wire Reset; //active low

output Clock125; wire Clock125;

output Clock125_90; wire Clock125_90;

output Clock1; wire Clock1; // Pulses (8*4 ns width, 1 MHz freq)

// Clock Enables

output Clock125Ena; wire Clock125Ena;

output Mac0ClockEna; wire Mac0ClockEna;

output Mac1ClockEna; wire Mac1ClockEna;

output Mac2ClockEna; wire Mac2ClockEna;

output Mac3ClockEna; wire Mac3ClockEna;

// SRAM arbiter

output SramAccess; reg SramAccess;

output [1:0] SramAccessSel; wire [1:0] SramAccessSel;

// Bus Clocks

// Bus Rx clocks

input BusRxClock_p, BusRxClock_n;

// Bus Tx clocks

output BusTxClock_p, BusTxClock_n; wire BusTxClock_p, BusTxClock_n;

 

localparam GND = 1'b0;

localparam VCC = 1'b1;

 

 

// Rx Clock 125 MHz

wire BusClock125;

IBUFDS rx_clockx1 ( .O(BusClock125), .I(BusRxClock_p), .IB(BusRxClock_n) );

BUFG bufgx1 ( .O(Clock125), .I(BusClock125) );

 

// Reset DCM

reg DcmReset; //active high

reg [3:0] CountDcmReset;

always @(posedge Clock125 or posedge BusReset)

if (BusReset) begin

DcmReset=VCC;

CountDcmReset=0;

end //if

else if (CountDcmReset<4'b1111)

CountDcmReset=CountDcmReset+1;

else

DcmReset=GND;

 

// main DCM

input_dcm dcm (

.CLKIN_IN (Clock125),

.RST_IN (DcmReset),

.CLK0_OUT (Clock125_90),

.LOCKED_OUT (Reset) );

 

// BUS Tx Clock

sram_write_clock write_clock (

.RESET (~Reset),

.CLK (Clock125_90),

.O_DDR_CLK (BusTxClock_p),

.O_DDR_CLK_BAR (BusTxClock_n) );

 

//Generate Clock Enable strobes and SRAM access (mac or bus write)

// Clock125 _|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|

// ClockEnaCount | 0 | 1 | 2 | 3 | 0 | 1 | 2 | 3 | 0 | 1 | 2 | 3 | 0 |

// Clock125Ena _|---|___________|---|___________|---|___________|---|

// Mac0ClockEna _|---|___________|---|___________|---|___________|---|

// Mac1ClockEna _____|---|___________|---|___________|---|___________|

// Mac2ClockEna _________|---|___________|---|___________|---|_______

// Mac3ClockEna _____________|---|___________|---|___________|---|___

// SramAccess _|---------------|_______________|---------------|___

reg [1:0] ClockEnaCount;

always @(posedge Clock125)

if (ClockEnaCount<2'b11)

ClockEnaCount=ClockEnaCount+1;

else begin

SramAccess=~SramAccess;

ClockEnaCount=0;

end //else

assign Clock125Ena=(ClockEnaCount==2'd0);

assign Mac0ClockEna=(ClockEnaCount==2'd0);

assign Mac1ClockEna=(ClockEnaCount==2'd1);

assign Mac2ClockEna=(ClockEnaCount==2'd2);

assign Mac3ClockEna=(ClockEnaCount==2'd3);

assign SramAccessSel=ClockEnaCount;

 

// Generate 1 Mhz strobe

localparam PERIOD_OF_MHZ=7'd124;

reg Clock500k;

reg [6:0] TimerCount;

always @(posedge Clock125 or posedge BusReset)

if (BusReset) begin

Clock500k=0;

TimerCount=0;

end //if

else if (TimerCount<PERIOD_OF_MHZ)

TimerCount=TimerCount+1;

else begin

Clock500k=~Clock500k;

TimerCount=0;

end //else

 

// Generate Clock enable pulse every 1000 ns

reg Clock500kReg, Clock500kRegReg;

always @(posedge Clock125)

if (Clock125Ena) begin

Clock500kReg <=Clock500k;

Clock500kRegReg <=Clock500kReg;

end //if

assign Clock1=(Clock500kReg!=Clock500kRegReg);

 

endmodule //clock_gen

 

тут Clock125 это тот же Clock

top.txt

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


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

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

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

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

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

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

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

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

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

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