emeb_mac has joined ##openfpga
gsi__ has joined ##openfpga
gsi_ has quit [Ping timeout: 245 seconds]
genii has quit [Remote host closed the connection]
oeuf has joined ##openfpga
dh73 has joined ##openfpga
vonnieda has joined ##openfpga
dj_pi has joined ##openfpga
dh73 has quit [Ping timeout: 260 seconds]
solo1 has joined ##openfpga
Bike has quit [Quit: Lost terminal]
flea86 has joined ##openfpga
dj_pi has quit [Ping timeout: 248 seconds]
Thorn has quit [Read error: Connection reset by peer]
kc8apf has quit [Read error: Connection reset by peer]
kc8apf has joined ##openfpga
Miyu has joined ##openfpga
emeb has quit [Quit: Leaving.]
solo1 has quit [Ping timeout: 246 seconds]
pie_ has quit [Ping timeout: 252 seconds]
azonenberg_work has quit [Ping timeout: 276 seconds]
emeb_mac has quit [Ping timeout: 245 seconds]
s_frit_ has joined ##openfpga
s_frit has quit [Ping timeout: 245 seconds]
Asu has joined ##openfpga
futarisIRCcloud has quit [Quit: Connection closed for inactivity]
knielsen has quit [Ping timeout: 252 seconds]
Asu` has joined ##openfpga
Asu has quit [Ping timeout: 245 seconds]
AndrevS has joined ##openfpga
Asu` has quit [Remote host closed the connection]
Asu` has joined ##openfpga
ZipCPU|Laptop has joined ##openfpga
Maya-sama has joined ##openfpga
Miyu has quit [Ping timeout: 252 seconds]
espes has joined ##openfpga
Thorn has joined ##openfpga
Maya-sama is now known as Miyu
dj_pi has joined ##openfpga
Miyu has quit [Read error: Connection reset by peer]
Miyu has joined ##openfpga
ZipCPU|Laptop has quit [Ping timeout: 244 seconds]
dj_pi has quit [Ping timeout: 258 seconds]
ZipCPU|Laptop has joined ##openfpga
pie_ has joined ##openfpga
pie_ has quit [Remote host closed the connection]
pie_ has joined ##openfpga
pie_ has quit [Remote host closed the connection]
pie_ has joined ##openfpga
pie_ has quit [Remote host closed the connection]
pie_ has joined ##openfpga
pie_ has quit [Remote host closed the connection]
pie_ has joined ##openfpga
pie_ has quit [Remote host closed the connection]
pie_ has joined ##openfpga
<ZirconiumX> So, since bitstream RE is apparently on-topic, I have a small announcement
<ZirconiumX> I managed to RE the Cyclone V LUT from the bitstream format
<ZirconiumX> It took two hours >.>
<whitequark> wasn't someone else working on Cyclone V?
<ZirconiumX> dh73 and bwidawsk
<ZirconiumX> But dh73's flow goes through Quartus
<whitequark> ahh
<ZirconiumX> Essentially Quartus lets you give it RTL in the form of Verilog
<ZirconiumX> Which is nice, but difficult to test
Dolu has quit [Ping timeout: 245 seconds]
<ZirconiumX> Now I need to figure out how to automate this
<ZirconiumX> I also have no idea where in the FPGA my LUT actually is
<whitequark> have you looked at what prjtrellis, prjxray, etc do?
<ZirconiumX> Anyway, whitequark, we have a small IRC channel if you at all care
<ZirconiumX> Not for the PnR side of it
<ZirconiumX> I know there are fuzzers for this kind of thing
Dolu has joined ##openfpga
dj_pi has joined ##openfpga
solo1 has joined ##openfpga
dh73 has joined ##openfpga
genii has joined ##openfpga
ZipCPU|Laptop has quit [Ping timeout: 272 seconds]
dj_pi has quit [Ping timeout: 258 seconds]
<hackerfoo> ZirconiumX: Which IRC channel?
<ZirconiumX> #prjmistral
<keesj> Cool
vonnieda has quit [Quit: My MacBook Pro has gone to sleep. ZZZzzz…]
dh7356 has joined ##openfpga
emeb has joined ##openfpga
<hackerfoo> ZirconiumX: Thanks. I have a SoCKit with a Cyclone V.
<ZirconiumX> It'll be a pretty long time until you get anything interesting from this
<ZirconiumX> Even the known unknowns are pretty major effort
<hackerfoo> Yeah, so it's good that someone has started on it.
<ZirconiumX> There are a handful of us
dh73 has quit [Ping timeout: 260 seconds]
<hackerfoo> Most of us working on SymbiFlow are busy with Xilinx 7 series, but I'm interested in Altera/Intel. There's only a few of us, also.
<ZirconiumX> This is an unpaid hobby project to keep me occupied for a while
dh7356 has quit [Ping timeout: 260 seconds]
<hackerfoo> ZirconiumX: Is there a public repo for prjmistral?
<ZirconiumX> Yeah, but there's no actual data there at the moment, just a mock flow
<ZirconiumX> (name context: https://en.wikipedia.org/wiki/Mistral_(wind) )
<whitequark> i like how each RE project uses a pun as a name
<ZirconiumX> Also useful for avoiding any copyright claims
ondrej3 has quit [Quit: Leaving]
<ZirconiumX> I can't think of a neat way of doing bitstream -> LUT conversion, so 64 if statements it is
<whitequark> you could use a lookup table
<whitequark> although i personally used um, give me a secon
<ZirconiumX> I'd need quite a few of them for each individual byte
<whitequark> byte?
<ZirconiumX> Pass bytes in, or together the resulting LUT
Asu has joined ##openfpga
Asu` has quit [Ping timeout: 268 seconds]
vonnieda has joined ##openfpga
vonnieda has quit [Read error: Connection reset by peer]
vonnieda_ has joined ##openfpga
pie__ has joined ##openfpga
pie_ has quit [Remote host closed the connection]
pie__ has quit [Remote host closed the connection]
pie__ has joined ##openfpga
pie__ has quit [Remote host closed the connection]
genii has quit [Remote host closed the connection]
pie__ has joined ##openfpga
pie__ has quit [Remote host closed the connection]
pie_ has joined ##openfpga
mumptai has joined ##openfpga
ym has joined ##openfpga
dh73 has joined ##openfpga
<azonenberg> ZirconiumX: just index into a truth table
<azonenberg> for a lut4: wire[15:0] lut = $VALUE; wire[3:0] a = {a3, a2, a1, a0}; assign out = lut[a];
<azonenberg> or what are you trying to do
<ZirconiumX> azonenberg: I'm writing a LUT scrambler/descrambler for a Cyclone V bitstream
<ZirconiumX> No Verilog here
<ZirconiumX> Given an input LUT, lay out the bits of the LUT how the bitstream expects them
<ZirconiumX> And conversely, given a bitstream, retrieve the bits of the LUT
<whitequark> azonenberg: that's actually an incorrect way to implement a LUT in Verilog
<azonenberg> whitequark: oh?
<whitequark> for two unrelated reasons even
* whitequark should write "The Verilog Haters' Handbook"
<azonenberg> i'm assuming a behavioral sim model without reprogramming
<whitequark> yes.
<whitequark> incorrect.
<azonenberg> how?
<whitequark> 1) it doesn't do correct x-propagation (i.e. a symmetric LUT driven by an x input should not result in x output)
<azonenberg> ... x's
<whitequark> 2) it doesn't introduce delta cycles and so simulators will glitch at the very start of simulation
<whitequark> this was actually how behavioral LUT models were written in Yosys
<whitequark> and it does break in real world in very confusing ways
<azonenberg> I would probably also add assertions to verify that there are no X's
<whitequark> then you can never disconnect an input to this LUT
<azonenberg> You never should
<azonenberg> tie off if not used
<ZirconiumX> At least Verilog only has 4 logic levels, not 9 ^^;
<whitequark> well, arguably x-propagation is a feature of behavioral Verilog, not a bug
<whitequark> but yes, I guess asserting that the inputs aren't x also works
<whitequark> still two bugs :)
<azonenberg> My rule is that if your FPGA design ever has an X, there is a bug in either the simulation or your rtl, if not both
<azonenberg> in ASIC having no reset is OK for datapath elements that dont need it
<azonenberg> but in FPGA everything should always be well defined
<tnt> azonenberg: Heh .. bram content can be x, srl content can be x, ...
<tnt> I want my simulator to properly show me thos 'x' are stopped where I designed them to be stopped.
<whitequark> azonenberg: that's the philosophy on which migen is designed
<azonenberg> bram content can only get X if you violate timing iirc
<whitequark> no, uninitialized bram
<azonenberg> i dont think that is possible on xilinx
<whitequark> sometimes you physically cannot fit initialization data into the bitstream
<tnt> and there is more than xilinx :p
<whitequark> for FPGAs with onboard flash
<azonenberg> there is always an init value, if not specified it defaults to zero
<whitequark> MachXO2 for example
<azonenberg> i dont think xilinx has an option to omit it
<whitequark> not necessarily
<azonenberg> that was why they had the bitstream compression option
<azonenberg> because otherwise an empty fpga has a huge bitstream from all the bram init
<whitequark> for example, on ice40, the WARMBOOT primitive allows retaining BRAM contents
<whitequark> so that would also be x
<whitequark> logically
<tnt> spram can't even _be_ initialized.
<whitequark> also that
<whitequark> the other use of X is essentially the same as undefined behavior in C/C++
<whitequark> if an input to logic is provably X, synthesizer can pick it to be anything that's smaller because you are declaring that it doesn't matter which it is
<azonenberg> pretty sure on xilinx lutram initializes to a known value, default zero, too
<azonenberg> it just uses the truth table bits in the bitstream
<whitequark> Xilinx is not the only or the best FPGA vendor
<whitequark> and we were talking about ice40 single port ram
<azonenberg> ah ok
<whitequark> which is just a SRAM macro
<whitequark> on ECP5 you can definitely omit BRAM init commands
<azonenberg> interesting
<whitequark> and interestingly, you can initialize several BRAMs with one data block
<azonenberg> i like the xilinx philosophy re that, undefined behavior is a bug so kill it
<whitequark> so no matter how many zeroed BRAMs you have, the size is almost the same
<tnt> azonenberg: but there are also resets without reboot of the whole fpga in which case bram/dist ram content is ... whatever is left from the previous run. And I'd rather my simulation shows me that as 'x' to make sure it doesn't break my logic.
<azonenberg> xilinx has that if you enable compression
<whitequark> ah
<azonenberg> its basically frame based lempel-ziv
<whitequark> I'm not sure if that's actually xilinx philosophy
<whitequark> oh!
<azonenberg> rather than having content you have a header that says "go back and load frame X from before"
<whitequark> they have X on bram output with some combination of BRAM port modes
<azonenberg> i think thats only if you have a read-write collision under certain conditions on the same address
<whitequark> yes
<azonenberg> Which IMO should be a fatal timing error
<whitequark> no
<azonenberg> and abort sim
<whitequark> it's perfectly well defined on every other FPGA
<azonenberg> I like -Werror :p
<whitequark> (usually, old data is read)
<whitequark> I like BRAMs that behave sensibly
<azonenberg> xilinx has several different modes
<azonenberg> you can read the old data or the new data
<azonenberg> there's optional forwarding
<azonenberg> the issue is if you have a dual port ram and you have both ports write the same address
<azonenberg> Or if you read the same on one port and write on the other port, but with offset clocks
<azonenberg> this isnt a xilinx issue, asic srams have the same problem
<whitequark> the latter is a timing error, definitely
<azonenberg> its an inherent issue with 8t sram
<whitequark> the former is not
<whitequark> hm
<azonenberg> when you activate both sets of row drivers
<azonenberg> basically you have an internal bus fight
<whitequark> so you could add a comparator that inhibits one of them
<azonenberg> That is something you'd do in your design
<whitequark> but xilinx has forwarding in silicon
<azonenberg> Yeah
<whitequark> why not add the comparator in silicon too?
<whitequark> it's cheaper there, too
<azonenberg> You'd also have to add a config bit saying which one to inhibit
<azonenberg> to keep the ram symmetric
<whitequark> sure
<azonenberg> but yeah i would support such a design
<whitequark> ah, another issue with xilinx is that they don't actually respect the behavioral memory models
<whitequark> the same behavioral model can get synthesized as BRAM and DRAM and you end with different semantics
<whitequark> their "solution" is to copy their macro exactly, which directly contradicts 1364.1-2002
<daveshah> Xilinx Ultrascale+ URAM (288kbit blocks) is uninitializable and I think starts up undefined
<daveshah> It's a single clock RAM, and has sensible collision behaviour iirc
gsi__ is now known as gsi_
<azonenberg> ultraram is double pumped
<azonenberg> So it has well defined collision semantics becuase there isnt a bus fight
solo1 has quit [Quit: WeeChat 2.4]
<azonenberg> i.e. port X happens then port Y
<azonenberg> i forget the ordering
<azonenberg> internally it's 6T cells
<azonenberg> But this is very different from 8T SRAM which allows true dual clock operation but also can have collisions
<whitequark> yes but it's still uninitializable and undefined at start
rohitksingh has joined ##openfpga
<azonenberg> ok fair enough
flea86 has quit [Quit: Goodbye and thanks for all the dirty sand ;-)]
<ZirconiumX> The thing I hate most about IE{EE,TF} standards is that they're just numbered and you're expected to recognise them, but somebody could be like "This is a direct contradiction of IEEE 1584" and I'll just smile and nod.
<whitequark> I have a huge stash of standards and desktop search so it's not such a huge issue...
<emeb> instant citation - just don't try to peer beneath the surface.
<whitequark> also nobody in the world will recognize IETF RFCs
<whitequark> TCP alone is defined by like fifteen RFCs, none of which make any sense in isolation, and none of which are of much use if you're building a real-world high-performance stack
<whitequark> grumble grumble
<gruetzkopf> this directly contradicts IEEE 1284, IEEE 1394 and IEEE 1588
<whitequark> 1284 is parallel port, 1394 is firewire, and 1588 is ... ptp?
<gruetzkopf> yes
<whitequark> what about IEEE 69 and IEEE 420
<gruetzkopf> (at least it's not IEEE 802.5)
<gruetzkopf> oh IEEE 420-2013 is a fun one
<gruetzkopf> IEEE 420-2013 - IEEE Standard for the Design and Qualification of Class 1E Control Boards, Panels, and Racks Used in Nuclear Power Generating Stations
* gruetzkopf applies shibboleth to IEEE website
<whitequark> I cant seem to find IEEE 69
<gruetzkopf> power distribution stuff
<emeb> the nice thing about standards is that there are so many to choose from
<gruetzkopf> okay, i got 420-2013
forrestv has quit [Ping timeout: 252 seconds]
rohitksingh has quit [Ping timeout: 268 seconds]
forrestv has joined ##openfpga
ZipCPU|Laptop has joined ##openfpga
ZipCPU|lapt0p has joined ##openfpga
ZipCPU|lapt0p has quit [Remote host closed the connection]
mossmann has quit [Ping timeout: 245 seconds]
yhetti has quit [Ping timeout: 244 seconds]
Richard_Simmons has joined ##openfpga
Bob_Dole has quit [Ping timeout: 250 seconds]
<_whitenotifier-3> [whitequark/Boneless-CPU] whitequark pushed 2 commits to master [+0/-0/±7] https://git.io/fjXfz
<_whitenotifier-3> [whitequark/Boneless-CPU] whitequark 649e050 - gateware.core_fsm: fix legacy implementation to run on new nMigen.
<_whitenotifier-3> [whitequark/Boneless-CPU] whitequark f1a113b - gateware.{core,decoder}_v3: implement window instructions.
yhetti has joined ##openfpga
mossmann has joined ##openfpga
m_w has quit [Quit: leaving]
Miyu has quit [Ping timeout: 252 seconds]
<kc8apf> ZirconiumX: feel free to ping me about bitstream <-> RTL conversions. I wrote a fair amount of the low-level parsing for prjxray. Coming up with a decent abstraction for that stuff is challenging
<ZirconiumX> kc8apf: come join us in #prjmistral; the more the merrier
<kc8apf> *sigh* another channel to monitor
<ZirconiumX> You don't have to monitor it
<ZirconiumX> But "kc8apf" is perhaps not the most memorable of names
<kc8apf> it is globally unique though
ZipCPU|Laptop has quit [Ping timeout: 245 seconds]
<gruetzkopf> K.. US-FCC coordinated?
<kc8apf> yup
<kc8apf> in case you want to send me FPGA dev boards
X-Scale has joined ##openfpga
ZipCPU|Laptop has joined ##openfpga
<_whitenotifier-3> [whitequark/Boneless-CPU] whitequark pushed 4 commits to master [+0/-0/±8] https://git.io/fjXUy
<_whitenotifier-3> [whitequark/Boneless-CPU] whitequark 9bdc785 - gateware.decoder_v3: implement JAL.
<_whitenotifier-3> [whitequark/Boneless-CPU] whitequark 3b6535e - arch.opcode_v3: design JALR.
<_whitenotifier-3> [whitequark/Boneless-CPU] whitequark 924663b - gateware.{core,decoder}_v3: implement JALR.
<_whitenotifier-3> [whitequark/Boneless-CPU] whitequark f4051b5 - gateware.{core,decoder}_v3: implement JT. (all implemented now!)
<mithro> kc8apf: What is that library you for binary file parser generation stuff?
<kc8apf> Kaitai does an ok job for getting the basics down
<kc8apf> I'm working on my own for more complicated formats
<mithro> kc8apf: What was the limit of Kaitai?
etrig has quit [Quit: installing latest plan9 release]
<mithro> kc8apf: Did you ever write a blog post about the limits?
<kc8apf> It is strictly stateless.
<kc8apf> And it uses JSON which is terrible for encoding binary literals
<whitequark> hm
<whitequark> what's the inverse of a "leaf function"
<sorear> I think I’ve seen stem
mumptai has quit [Quit: Verlassend]
<whitequark> kay, that works
AndrevS has quit [Remote host closed the connection]
Jybz has joined ##openfpga
Asu has quit [Quit: Konversation terminated!]
Bike has joined ##openfpga
vonnieda_ has quit [Quit: My MacBook Pro has gone to sleep. ZZZzzz…]
Jybz has quit [Quit: Konversation terminated!]