specing_ has joined ##openfpga
specing has quit [Ping timeout: 252 seconds]
specing_ is now known as specing
sgstair has joined ##openfpga
Morn_ has quit [Ping timeout: 248 seconds]
Morn_ has joined ##openfpga
Degi_ has joined ##openfpga
Degi has quit [Ping timeout: 265 seconds]
Degi_ is now known as Degi
tokomak has joined ##openfpga
Adluc has quit [Ping timeout: 258 seconds]
Adluc has joined ##openfpga
ayazar has quit [Quit: Ping timeout (120 seconds)]
ayazar has joined ##openfpga
falteckz has joined ##openfpga
Miyu has joined ##openfpga
hackkitten has quit [Ping timeout: 260 seconds]
<promach3> if there are 8 REF-Commands postponed, then it should be 7 x tREFI instead of 9 x tREFI
Miyu is now known as hackkitten
<lambda> no, normally it's 1x tREFI, for each postponed refresh that time is increased by 1 tREFI
<promach3> lambda: why inside Figure 4, there are 8 REF-Commands postponed inside a single tREFI ?
specing_ has joined ##openfpga
<lambda> promach3: to demonstrate how postponing refreshes works
specing has quit [Ping timeout: 240 seconds]
specing_ is now known as specing
<promach3> lambda: I do not understand
<lambda> I don't really understand your question either, please elaborate
<promach3> the memory controller has to issue a REFRESH command at an average interval of tREFI , so how does the postponing works ?
<lambda> that's exactly what the diagram is trying to show you
<promach3> and Why 9 x tREFI instead of 7 x tREFI ?
<lambda> because 8 refreshes are postponed
<promach3> then it should be 7 x tREFI then
<lambda> no, as I said before
<promach3> wait, I am confused now
ayazar has quit [Quit: The Lounge - https://thelounge.chat]
ayazar2 has joined ##openfpga
ayazar2 has quit [Quit: The Lounge - https://thelounge.chat]
ayazar2 has joined ##openfpga
emeb has joined ##openfpga
<promach3> lambda: why 8 REF commands lead to 9 x tREFI ?
<vup> promach3: Simple example: If you don't postpone any you have 1 × tREFI. Now you postpone one, so you have a additional 1 × tREFI, which makes a total of 2 × tREFI
<vup> Continue to 8 postponed -> 9 × tREFI
<promach3> lambda: however, in that picture, 8 REF commands are **SQUEEZED** in between just 1 single tREFI
<lambda> promach3: yes, those are the refreshes that have been postponed
<promach3> lambda: but why **SQUEEZE** ?
<lambda> because that's the fastest way to catch up
<promach3> <lambda "because that's the fastest way t"> catch up on which exact DDR timing parameter ?
<promach3> > <@freenode_lambda:matrix.org> because that's the fastest way to catch up
<promach3> * catch up on which exact DDR timing parameter specification ?
<lambda> the amount of refreshes you need in a given time frame
<lambda> sure you can also just sprinkle in an extra refresh every once in a while, but it'll be a lot longer until you can postpone another complete 8 refreshes
<promach3> which is equivalent to tREFI
<promach3> lambda: if those 8 REF commands are **SQUEEZED** , why are they still called/referred as **POSTPONED** ?
<hell__> > to delay an event or arrange for it to take place at a later time
<promach3> lambda: how SQUEEZED == POSTPONED in terms of DDR timing-wise ?
<hell__> these 8 REF commands got delayed. in a regular scenario, refreshes happen every tREFI time, but in this case they happened later
<hell__> one could continue to operate with 8 postponed refresh cycles, but it's not a good idea (you cannot delay refreshes at all)
<promach3> hell__: you mean DDR memory controller at FPGA side will need to **remember** there are still eight outstanding REF commands at every execution clock cycles ?
<hell__> yes, the memory controller needs to have a scheduler
<lambda> a simple ddr controller can also just not delay any refreshes
<hell__> it still needs to have a scheduler
<hell__> one can't perform a read/write and a refresh command at the same time
<hell__> the scheduler decides which one should take place first
<lambda> alright, I guess "do a refresh whenever you have to, otherwise do transfers" would count as a simple scheduler then
<hell__> a simple scheduler could favor refresh commands over anything else, but performance won't be optimal
<lambda> of course
<promach3> lambdahell__ my scheduler does not work https://github.com/promach/DDR/blob/main/ddr3_memory_controller.v#L952 is always `true`
<promach3> let me digest what you had said first
<hell__> once that works, one can try to postpone some refresh cycles. choose a "watermark" value: if the number of outstanding refresh cycles is below the watermark, favor regular operations over refresh cycles; otherwise, favor refresh cycles over anything else
<hell__> when the scheduler queues are empty, execute any postponed refreshes, then idle
<hell__> promach3: does that single file contain all of the memory controller logic?
<promach3> <hell__ "promach: does that single file c"> hell__: yes
<hell__> I'd highly recommend splitting it up in "blocks", then
<hell__> I can't read HDL, but I see you have a state variable for each command, and also for the initialisation sequence
<promach3> <hell__ "I can't read HDL, but I see you "> yes
<hell__> I wouldn't put the initialisation sequence in the state machine
<hell__> rather, have one block that handles sending commands to the DRAM, and another block that decides which commands to send
<promach3> lambda hell__ one more question, do all 8 refresh commands **FINISH** execution inside that **squeezed(( tREFI inside Figure 4 ?
<promach3> * lambda hell__ one more question, do all 8 refresh commands **FINISH** execution inside that **squeezed** tREFI inside Figure 4 ?
<promach3> * lambda hell__ one more question, do all 8 refresh commands **FINISH execution** inside that **squeezed** tREFI inside Figure 4 ?
<hell__> yes, I read you
<hell__> yes, in the picture they happen inside one tREFI cycle
<promach3> <hell__ "yes, I read you"> what did you exactly mean by this particular above reply ?
<lambda> (hell__: that's just the matrix bridge's way of showing edits)
<hell__> ah, to me it showed as three different messages (I use actual IRC)
<promach3> hell__: try to use Element RIOT matrix client
<lambda> same, but the sender has no idea they're being spammy :/
<hell__> promach3: however, if tREFI < 8 * tRFC then it's impossible to do all 8 refresh commands inside one tREFI cycle
<lambda> promach3: also, if I understand correctly, even the "squeezed" refreshes are all tRFC apart, which is the time it takes for a refresh to finish
<hell__> the problem with these diagrams is that they show commands as points in time
<hell__> a more accurate representation would be to draw the commands as rectangles, where the width is the time that a command takes
<hell__> more or less like a Gantt chart: https://en.wikipedia.org/wiki/Gantt_chart
<hell__> there's probably something better, like the kind of diagrams used to represent task scheduling in RTOSes
<hell__> maybe something like this? https://www.freertos.org/implementation/a00005.html
<hell__> meh, now I want to get a FPGA and try to make my own DDR3 memory controller :S
<promach3> <hell__ "promach: however, if tREFI < 8 *"> let me double check the datasheet
scientes has quit [Changing host]
scientes has joined ##openfpga
<promach3> hell__lambda I just calculated: tREFI = 65*tRFC , so it is entirely possible to do all 8 refresh commands inside one tREFI cycle since each refresh command will take tRFC cycle to finish
<promach3> please correct me if the calculation is wrong
<hell__> tREFI is usually quite large, so it's reasonable
<promach3> hell__: must all 8 refresh commands finish in a single tREFI cycle ?
<hell__> not necessarily
<promach3> <hell__ "not necessarily"> but it will violate the highlighted timing as shown below
<promach3> hell__
<promach3> there is no mention how long can refresh commands be postponed ? as in when is the first postponed refresh command to be executed after the first non-postponed refresh command + 9*tREFI ?
<promach3> lambda: any idea ?
<hell__> as long as there's less than 9 outstanding refresh commands, refreshes can be postponed indefinitely
<promach3> <hell__ "as long as there's less than 9 o"> no, there is still a 7.8us timing spec to be met
<hell__> *average*
<hell__> read the paragraph below
<promach3> I do not understand this sentence though
<hell__> we've been over this several times already
tokomak has quit [Read error: Connection reset by peer]
fibmod has quit [Ping timeout: 240 seconds]
dfgg has quit [*.net *.split]
Xark has quit [*.net *.split]
Xark has joined ##openfpga
dfgg has joined ##openfpga
Lord_Nightmare has quit [Quit: ZNC - http://znc.in]
Lord_Nightmare has joined ##openfpga