Saturday, 2020-06-13

*** tpb has joined #litex00:00
benhsomlo: looking at https://github.com/litex-hub/linux/commit/3856b9eae1cd7a243faf13d0d4f41ef337c2537600:27
tpbTitle: litex_soc_ctrl: use published api for cpu-native access with barriers · litex-hub/linux@3856b9e · GitHub (at github.com)00:27
benhsomlo: this comforts me in saying we should use a fixed endianness (preferably LE) for Linux SoCs :-)00:27
benhsomlo: also we may want to add a DT concept of csr-parent pointing to the CSR master or something because for non-LiteX SoCs using LiteX components, one can have multiple CSR busses00:28
benhfor example microwatt will probably end up with completely separate CSR busses for liteeth and litesdram00:28
*** Skip has quit IRC00:31
benhsomlo: also liteeth has a bug .. the PHY CRG reset ... it's poking at the ethernet mmio instead of the CSRs :)00:42
benhsomlo: my preference for CSRs is that any device that has some has the base of them in its "reg" property like any other MMIO range00:43
benhsomlo: we *could* provide inline accessors for the read/write but of we make them just 32-bit LE it's not even necessary00:43
benhalong with _florent_ work to fix CSR addresses, we completely remove the need for that common CSR layre00:44
benhand it removes problems with multiple CSR busses when using standalone cores etc...00:44
benhI think it's a much better approach this way...00:44
benhis there a better place to discuss this ?00:44
benhsomlo: if we really want to keep them native, we can do an inline accessor, but at least the CSR base should just be an mmio region of the device00:46
benhobtained from the device-tree00:46
futarisIRCcloudDiscussion is probably best here, or on the linux-litex mailing list ...01:06
futarisIRCcloudawordnot: Xilinx series 7 does work in Synopsys as of a few weeks ago.01:20
awordnotfutarisIRCcloud: I'm not familiar with Synopsys. Is it related to the series 7 bitstream reverse engineering efforts?01:21
futarisIRCcloudYep.01:22
awordnotcool, I'll have to take a look.01:23
futarisIRCcloudSymbiFlow examples:01:23
futarisIRCcloudhttps://github.com/SymbiFlow/symbiflow-examples01:23
tpbTitle: GitHub - SymbiFlow/symbiflow-examples: Examples designs for showing different ways to use SymbiFlow toolchains. (at github.com)01:23
mithrosomlo / kgugala: benh recently pointed out https://lwn.net/Articles/451789/ -- https://programmer.group/regmap-api-a-register-map-abstraction.html -- https://opensourceforu.com/2017/01/regmap-reducing-redundancy-linux-code/01:24
tpbTitle: regmap: Generic I2C and SPI register map library [LWN.net] (at lwn.net)01:24
futarisIRCcloudThat stuff does reduce redunancy.01:25
futarisIRCcloudaword: SymbiFlow is what I meant before...01:25
benhfutarisIRCcloud: where is that mailing list ?01:25
futarisIRCcloudawordnot: SymbiFlow is what I meant before...01:25
awordnotfutarisIRCcloud: cool. Is this stuff to the point where I can build something like a VexRiscv soc w/ LiteDRAM?01:25
mithroawordnot: Yes - but it wouldn't say it is user ready yet01:26
awordnotwow, still, that's super impressive01:27
futarisIRCcloudYeah. Like mithro says, it works. But not as well as Vivado (yet).01:27
futarisIRCcloudSee section 3 of https://github.com/SymbiFlow/symbiflow-examples/blob/master/README.md01:27
tpbTitle: symbiflow-examples/README.md at master · SymbiFlow/symbiflow-examples · GitHub (at github.com)01:27
mithroI dislike vivado intensely, but is clearly still a long way ahead of the Yosys+vtr flow for now01:28
awordnotthis seems to be far more mature than I would have guessed though01:29
awordnotmassively impressive work01:29
futarisIRCcloudbenh: https://groups.google.com/forum/#!forum/linux-litex01:38
tpbTitle: Google Groups (at groups.google.com)01:38
benhhow do you use those google groups like a normal mailing list ?01:42
benhI can't find a subscribe button :)01:42
benhah found "join group"01:43
benhhrm... it wants to send the mails to my gmail..no good01:43
mithrobenh: You can provide any email address...01:45
benhmithro: how ? the web UI doesn't seem to let me01:45
mithroGoogle groups seems to always get worst :/01:46
benhyeah01:46
benhit's a horrible web forum thing01:46
benhwhy not create a proper mailing list ? :)01:46
benhthat stuff is unusable for me01:47
mithrobenh: What email address do you want used?01:47
mithroEmailing [email protected] apparently? I can add you manually too01:48
benhmithro: [email protected]01:48
benhthanks !01:49
benhah there's a subscribe .. ok it wasn't documented in the web UI anywhere I could find01:49
*** Degi has quit IRC02:27
*** Degi has joined #litex02:28
*** guan has quit IRC02:34
*** mithro has quit IRC02:36
*** bubble_buster has quit IRC02:36
*** levi has quit IRC02:38
*** rohitksingh has quit IRC02:38
*** mithro has joined #litex03:15
*** bubble_buster has joined #litex03:17
*** levi has joined #litex03:17
*** guan has joined #litex03:18
*** rohitksingh has joined #litex03:21
benhmithro: just to see waht can of bloat it causes03:34
benhwe could play around with a device-tree node below each CSR "bus" node that contains basically a set of cs_<regname> = <reg offset, first bit, last bit>03:34
benhand have some wrappers to pipe that into regmap03:34
benhas long as we do that in a way that allow different devices to point to different CSR bridges03:35
benhbut if you're going  to do things like USB devices, PCIe devices, you really need fixed CSR offsets/layout03:35
benhunless you want every device to carry some kind of description ROM .. I don't think it's worth the pain03:35
*** mithro has quit IRC03:46
*** rohitksingh has quit IRC03:49
*** guan has quit IRC03:52
*** bubble_buster has quit IRC03:52
*** rohitksingh has joined #litex03:57
*** levi has quit IRC04:03
*** guan has joined #litex04:10
*** rohitksingh has quit IRC04:13
*** guan has quit IRC04:14
*** guan has joined #litex04:15
*** rohitksingh has joined #litex04:15
*** levi has joined #litex04:15
*** bubble_buster has joined #litex04:15
*** mithro has joined #litex04:19
*** st-gourichon-fid has joined #litex04:48
mithro_florent_: You should talk more about the documentation you have added to the LiteX wiki -- I didn't know 90% of it existed...05:00
*** _whitelogger has quit IRC05:45
*** _whitelogger has joined #litex05:47
*** dasdgw has quit IRC07:22
*** HoloIRCUser has joined #litex07:23
*** kgugala_ has joined #litex07:50
*** kgugala has quit IRC07:52
benhI notice LiteX PLL feeds CLKFBOUT directly into CLKFBIN .. isn't it supposed to have a BUFG in there?08:58
futarisIRCcloudYeah, the whole https://github.com/enjoy-digital/litex/wiki is a treasure. And https://github.com/enjoy-digital/colorlite is a good cheap example.09:21
tpbTitle: Home · enjoy-digital/litex Wiki · GitHub (at github.com)09:21
*** HoloIRCUser2 has joined #litex09:22
*** HoloIRCUser has quit IRC09:24
benhah forget about this, we don't need deskewing09:38
zypI'm playing with the cle215, mmap()-ing the FPGA memory space and I noticed that if I try doing an unaligned access, my whole host system locks up11:50
zypI don't need/expect unaligned accesses to work, but I'd like them to be more gracefully handled11:51
somlobenh: reading through all the stuff you said earlier :) I just checked, and I should be signed up for the linux-litex google group11:52
*** HoloIRCUser has joined #litex12:20
*** HoloIRCUser2 has quit IRC12:21
benhsomlo: ok cool, I signed up too12:32
benhsomlo: I need to hit the sack, but I am really keen on sorting out the CSR stuff in a way that allow multiple "things" on a given system to have completely different CSR busses12:33
benhsomlo: there are two approaches really... the easy one is we say it's just MMIO and each device has a CSR range in it's "reg" property along with whatever other MMIO12:33
benhsomlo: or we go full flex so we can have things with CSRs behind USB or god-knows-what like mithro would like12:34
benhsomlo: in which case we look into using regmap for them12:34
benh(which conveniently also supports native endian)12:34
benhsomlo: if we go down the regmap path, I'll need to spend a bit of time the next few days looking in more details how it actually works as I have seldom used it in the past12:35
benhsomlo: I need to crash now :) g'night12:35
zypif you're reworking the CSR stuff, I'd like a way to predefine the CSR layout, including adding gaps12:36
*** FFY00 has quit IRC12:54
*** FFY00 has joined #litex12:55
*** CarlFK has joined #litex15:08
*** CarlFK has quit IRC15:32
*** tcal has quit IRC15:47
*** tcal has joined #litex16:01
*** Skip has joined #litex16:31
*** kgugala has joined #litex16:46
*** kgugala_ has quit IRC16:50
*** HoloIRCUser1 has joined #litex16:56
*** HoloIRCUser has quit IRC17:00
*** tcal has quit IRC17:12
*** tcal has joined #litex17:23
*** kgugala_ has joined #litex17:54
*** kgugala has quit IRC17:58
*** acathla has quit IRC18:23
*** acathla has joined #litex18:25
*** acathla has quit IRC18:25
*** acathla has joined #litex18:25
zypfollow up on the unaligned accesses: I flipped some pcie options in the bios settings and unaligned reads now returns 0xffffffff and otherwise lets the host keep working19:19
zypI'm not very familiar with this stuff, but I guess what I did was turn on completion timeouts that was off by default19:20
*** kgugala has joined #litex20:34
*** HoloIRCUser has joined #litex20:35
*** kgugala_ has quit IRC20:37
*** HoloIRCUser1 has quit IRC20:38
*** tpearson-mobile has joined #litex20:49
tpearson-mobileI'm working on a new module deriving from Module and AutoCSR.  Fields that I define as CSRStorage show up in csr.h (i.e. appear in the SoC memory map) but all CSRConstants are removed20:50
tpearson-mobileIs there some trick beyond defining the constant in __init__ (e.g. self.magic_value = CSRConstant(0x123456)?20:50
*** CarlFK has joined #litex21:15
tpearson-mobileI'm working on a new module deriving from Module and AutoCSR.  Fields that I define as CSRStorage show up in csr.h (i.e. appear in the SoC memory map) but all CSRConstants are removed21:40
tpearson-mobileIs there some trick beyond defining the constant in __init__ (e.g. self.magic_value = CSRConstant(0x123456)?21:40
tpearson-mobilealso there seems to be a lot of issues with the Verilog external module support -- in particular relating to output signals into a CSRStatus.21:43
tpearson-mobileare there known issues with Verilog integration / CSRStatus?21:43
awordnottpearson-mobile: how are you assigning the verilog code's output to CSRStatus? With a csr.status.eq(verilog_signal) assignment in the comb domain?21:49
somloI give up... Fuck if I know WTF is going on anymore... https://pastebin.com/S5GPWkUz21:51
tpbTitle: Here's the code with added printf statements: DSTATUS disk_initialize(uint8_t - Pastebin.com (at pastebin.com)21:51
tpearson-mobileawordnot: It's nothing fancy: https://paste.ee/p/i6Dni21:53
tpbTitle: Paste.ee - View paste i6Dni (at paste.ee)21:53
somlo_florent_: I made `spisdcardstatus` volatile, so it "should" not "optimize" the return value based on the global default initial value...21:54
tpearson-mobilebasically as I continue to add more o_<whatever> signals that reference that CSRStatus, at some point I get random failures, e.g. multiply assigned signals (there are none), wrong bit widths (somewhere in LiteX something changes the module's defined bit width to a wrong value, then complains when it has to change it back) etc.21:54
somlobut I'm ready to go find a brick wall and start hitting my head against it, at this point that sounds like more fun than this :)21:54
tpearson-mobileI'm about ready to just create a Verilog shim module that exposes nice, neat 32 bit registers with the desired contents to the AutoCSR system21:55
awordnottpearson-mobile: Try creating an intermediate local Signal() with the correct width and connect that to the instance. Then add a `self.comb += mycsr.status.eq(intermediate)`21:56
tpearson-mobilehow about CSRConstant not working?21:56
awordnotnot sure about that one. The CSRConstant shown in that code you pasted doesn't show up in the outputted csr.h?21:57
tpearson-mobileright21:57
tpearson-mobileand it's just gone in the register map -- no space reserved for it at all21:57
awordnotodd. I haven't used CSRConstant personally but looking at some code that does, I don't see anything wrong with your example...22:00
tpearson-mobileYeah, it's odd...I don't have any desire to fight with magic Python code so I'm going to go down the shim route, but still...this kind of confirmed my fears in relation to migen :)22:01
tpearson-mobileif something breaks it's not easy to figure out what is going wrong much less fix it22:01
awordnotas more of a software person than a hardware one I've found migen to be quite enjoyable, but my hardware friends certainly don't seem to agree :)22:03
tpearson-mobile...guess which side I come from? :D22:04
awordnotheh22:04
tpearson-mobileI've never enjoyed masses of interlinked Python, they've always caused trouble that's taken time to fix -- on average, it's similarly opaque to when Windows has problems, with similar wastage of time, but that's just where I sit22:04
tpearson-mobileI will say the migen documentation is quite bad unless I'm just missing something -- lots of searching has yet to turn up anything that looks like class definitions, and many of the class names (Signal?  Module?) are so generic any online searches are useless22:06
awordnothave you seen this? https://m-labs.hk/migen/manual/reference.html#module-migen.fhdl.structure22:06
tpearson-mobiles/class definition/class documentation/22:06
tpbTitle: API reference Migen 0.8.dev0 documentation (at m-labs.hk)22:06
tpearson-mobileoh, it's finally loading.  Yesterday and the day before it was down22:06
tpearson-mobileyes, that looks better22:07
awordnotalso the source is quite well commented, so a quick grep for 'class Signal' or some such should return a lot of valuable information22:07
tpearson-mobilegrep where though?22:07
tpearson-mobileit's a ton of different repos and python modules22:07
awordnoti used the litex_setup.py script to clone all the litex repositories at once22:07
tpearson-mobileyes, I have all of them in one spot, but that's a lot of repos to have to grep through22:08
tpearson-mobilewhat I was looking for was more like this: https://doc.qt.io/qt-5/qwindow.html22:08
tpbTitle: QWindow Class | Qt GUI 5.15.0 (at doc.qt.io)22:08
somlotpearson-mobile: `grep -r` is your friend :)22:08
tpearson-mobileand I think now that m-labs.hk is up it might provide that?22:09
tpearson-mobilesomlo: yes, I know about it, I also know it takes time even on SSD to run :D22:09
awordnotI've found ripgrep to perform extremely well for cases like this22:09
awordnotworks great on ppc64le too :)22:10
tpearson-mobilesure, though I think my point of not having to grep sources for API documentation is a bit orthogonal to the exact tooling used to grep ;)22:10
tpearson-mobileI spent somewhere near an hour just trying to figure out how to assign a clock to an external Verilog module, and I'm still not sure it's right22:10
awordnotyeah that's fair. I will say that documentation has definitely been one of the biggest weaknesses i've encountered with migen/litex so far22:11
somlore. "interlinked python modules" -- I generally find object-oriented code (c++ and java too) to be newcomer (to the project, not to the language) unfriendly22:11
awordnotin case you haven't seen it, this page is also quite helpful: https://github.com/timvideos/litex-buildenv/wiki/LiteX-for-Hardware-Engineers#instances22:11
tpbTitle: LiteX for Hardware Engineers · timvideos/litex-buildenv Wiki · GitHub (at github.com)22:11
somlocan't just follow the thread of control to figure out what it does -- everything hapens magically "somewhere else" then where you're looking :)22:11
tpearson-mobileus hardware folks know we need to assign a certain signal to a certain line on a module or it'll fail in really nasty / hard to debug ways, and so far that has proven very difficult with so many key signals (clocks, resets) autogenerated deep in the bowels of litex/migen with no documentation on how to use or even access them22:11
tpearson-mobileyes22:11
somloand I'm more of a software guy myself (learned verilog relatively late in my life, but would prefer it over the meta-language generator stuff any day)22:12
awordnotfor future reference, ClockSignal(domain_name) and ResetSignal(domain_name) can be used to access the underlying Signal() object for those22:12
tpearson-mobilesomlo: If I was to be very snarky, I'd suggest Intel is using something that behaves in that manner to generate their chips they can't seem to scrub the vulnerabilities and bugs out of ;)22:12
somloand migen is not even that bad, you should see Chisel ::D22:12
tpearson-mobileawordnot: I managed to figure that out except the domain name22:13
awordnotif you omit the domain name, it'll default to `sys`22:13
tpearson-mobile...that said, what's the domain for the Wishbone POR signal?22:13
tpearson-mobile(again, docs are lacking at best)22:14
awordnotby default, I think all peripherals will be on the sys domain22:14
awordnots/all peripherals/everything/g22:15
awordnotunless you see explicit mention of other domains (a ClockDomainsRenamer(), or self.sync.<name> assignments), you can assume sys22:15
* tpearson-mobile doesn't mean to be adversarial, it's just ... the system seems to have a lot of promise, yet at the end of the day it's hardware folks that are designing the peripherals talking to the outside world, and those do not take kindly whatsoever to any sort of undefined behavior, no matter how well intentioned. Python is great at creating22:15
* tpearson-mobile undefined behavior especially in the form of random uncaught exceptions ;)22:15
tpearson-mobileOK22:16
tpearson-mobilehow does the Renamer work?22:16
tpearson-mobileI saw an example that to be frank was abstract nonsense to me22:16
tpearson-mobilee.g. if I have a core that needs sysclock, some other PLL output, and a phase shifted version, how does it work?22:16
awordnotif you have a module that needs to operate on multiple domains, I believe the way you'd handle it is by creating all the domains you need in the top level SoC's _CRG22:17
awordnotthen in the module itself, access the domains with self.sync.<domain_name>22:18
awordnotthe ClockDomainsRenamer comes in when you have a module that wasn't explicitly designed to run on a different domain (i.e. all of it's logic is done on sys), and you want to instantiate it with a different sys than the parent22:18
awordnotat least, that's my current understanding22:19
tpearson-mobile...sigh, the m-labs site doesn't even mention this magic ".sync" class22:19
tpearson-mobilehttps://m-labs.hk/migen/manual/search.html?q=sync&check_keywords=yes&area=default22:19
tpbTitle: Search Migen 0.8.dev0 documentation (at m-labs.hk)22:19
tpearson-mobileis that even documented anywhere?22:19
awordnothttps://m-labs.hk/migen/manual/fhdl.html#synchronous-statements22:20
tpbTitle: The FHDL domain-specific language Migen 0.8.dev0 documentation (at m-labs.hk)22:20
tpearson-mobileOK thanks22:21
awordnotnp22:22
tpearson-mobileI think I'm going to very much side with the other hardware engineers you have spoken with -- this is not a language I want to be designing anything of any complexity in :)22:22
tpearson-mobilethat said, since Verilog can be glued in, I'll just limit my exposure to this part of it ;)22:23
tpearson-mobileIt really seems to be mainly useful (i.e. not fighting the language) for pure behavioral descriptions of logic that isn't timing critical; i.e. single clock domain, no external interfaces beyond built-in busses like Wishbone22:24
awordnotyeah I definitely get where you're all coming from. thankfully the verilog interoperability seems to be quite usable so you still have a choice22:24
awordnoti'm not sure about that, there are some pretty complex designs written in migen (litepcie comes to mind)22:25
tpearson-mobileI guess more of a C++ to verilog tooling replacement than a direct VHDL/Verilog replacement22:25
awordnotbut it is definitely targeted towards a very specific group of developers22:25
tpearson-mobileawordnot: that may be true, but I have my suspicions that time to market and overall maintainability would be better with pure Verilog/VHDL there22:25
tpearson-mobilee.g. you could write a Linux kernel in Python, but would it be the right language?22:26
awordnotwell that would really just be down to the background skillset of the specific team in question22:26
tpearson-mobileeh, I'm not sure on that....it's fairly well known that software is either "pythonic" or not22:26
tpearson-mobileand for non-pythonic concepts, you're fighting the language more than anything else22:27
awordnotbut the reward is that you get access to rich compile-time metaprogramming, compared to crappy generate for loops in verilog/vhdl22:27
awordnotfor a lot of designs that probably doesn't matter though22:28
tpearson-mobilewell, if you're using for loops in systems that need the lower level Verilog access, you have no idea what you're doing anyway :D22:28
awordnoti was thinking more along the lines of writing generic modules (i.e. variable bus/data widths)22:28
awordnotlike some of xilinx's autogenerated AXI4 code tries to be generic verilog, but it ends up being quite ugly22:29
tpearson-mobilestill, you wouldn't use for loops for that22:29
awordnoti've worked on some verilog code that made heavy use of verilog's `generate for`22:30
tpearson-mobileanyway, it's sort of academic since Verilog can be tied in to LiteX/migen.  I guess much like you can write a native C module for Python22:30
awordnotyeah22:31
tpearson-mobileI can definitely see areas where it's going to be faster / easier to write migen and just let the HDL automagically come out of all the tooling, much like a compiler22:31
tpearson-mobilebut there are also areas where if you do that you're going to take a nasty performance hit (either area or speed, or both)22:32
awordnotit should be possible to create an identical representation of any verilog logic in migen, though like you said it might certainly get cumbersome22:33
tpearson-mobilee.g. the migen system is sufficiently disconnected from the hardware concepts (blocks wired together) that it lacks the equivalent of "inline asm" if you need to take control of some low level bit (much like Python on a standard system, I guess)22:33
awordnotalso sometimes you'll have to instantiate weird vendor primitives and such which can only work from verilog22:33
tpearson-mobileyeah, it's the cumbersome part that can send maintainability and expandability into the sewer :)22:33
tpearson-mobilewell, I think I have what I need to go back and try this at least, thanks for the pointers!22:34
awordnotno worries22:34
*** tpearson-mobile has quit IRC22:35
*** Skip has quit IRC22:53
*** HoloIRCUser2 has joined #litex22:53
*** HoloIRCUser has quit IRC22:57
mithroawordnot: Yeah - I think we should probably move that page from the litex-buildenv wiki to the litex wiki now that exists23:34
awordnotmithro: the LiteX For Hardware Engineers page? yeah it'd be great to have it all in the litex wiki23:35
*** tpearson-mobile has joined #litex23:44
tpearson-mobileI'm back....with a new set of issues :)23:44
awordnotwelcome :)23:45
tpearson-mobileI have a simple Verilog file that just provides a fixed value (0x01234567) to a 32-bit output23:45
tpearson-mobileI am using the same Module/AutoCSR tie-in as before23:45
tpearson-mobile(o_magic_number = self.magic_number.status)23:46
tpearson-mobilewhile it synthesizes etc. just fine, using "mr" on the target console is only ever giving me one byte23:46
tpearson-mobileit's as if the other three bytes are masked off to 0x0023:46
tpearson-mobileif I add several similar CSRStatus mappings, I see basically 0x01 0x00 0x00 0x00  0x01 0x00 0x00 0x00 ...23:47
tpearson-mobilei.e. the last three bytes are always masked off23:47
tpearson-mobileerr, sorry, typo23:48
tpearson-mobileit's actually worse than that23:48
tpearson-mobileI see 0x01 0x00 0x00 0x00 0x023 0x00 0x00 0x00 0x45 0x00 0x00 0x00 ...23:48
tpearson-mobileso it's not just masked off, it's actually inserting a bunch of unwanted bits23:48
tpearson-mobilewhen you run mr <addr> 1 it looks masked, you need to dump more words to see what it's actually doing23:49
tpearson-mobileideas?23:49
awordnotlooks like what's described here: https://github.com/timvideos/litex-buildenv/wiki/LiteX-for-Hardware-Engineers#csrs-config-and-status-registers23:49
tpbTitle: LiteX for Hardware Engineers · timvideos/litex-buildenv Wiki · GitHub (at github.com)23:49
awordnot"CSRs are a bit odd, by default they are byte-wide registers that are on 32-bit word boundaries. So a "32-bit" CSR is actually broken into four bytes spanning a total address space of 16 bytes. You can zpecify 32-bit wide CSRs but you’ll probably run into compatibility issues with other IP librariers that have hard-coded the 8-bit assumption. "23:49
tpearson-mobileoh23:50
tpearson-mobileouch23:50
awordnotyeah hmm that's an interesting design decision23:50
tpearson-mobilemaybe I should back up then and ask: what is the correct way to expose a set of 32 bit registers to the host?23:50
tpearson-mobilethis is SoC design 101, there should be an existing template for it23:50
awordnotI think the de facto way is to just use CSRs. I guess people just live with the address space bloat?23:53
awordnotthat seems a little strange though23:53
awordnotok, it looks like if you use the base CSR() class intead of CSRStorage() you can specify 32-bit width instead of 8-bit width23:55
awordnothttps://github.com/enjoy-digital/litex/blob/master/litex/soc/interconnect/csr.py#L7223:56
tpbTitle: litex/csr.py at master · enjoy-digital/litex · GitHub (at github.com)23:56

Generated by irclog2html.py 2.17.2 by Marius Gedminas - find it at https://mg.pov.lt/irclog2html/!