yasep/changes.txt (was : vspsim/updates.txt) The latest changes are at the bottom of the file. __________________________________________________________________________________ 2006-09-02 : - changed the last SWH to SHH (Store Word High to Store Half-word High) - moved/Split the JavaScript files to either JScore and JSgui, so the JScore files can be used without GUI or without the Mozilla environment (with a CLI for example) - removed "spacing:" in CSS because Firefox seems to dislike it... 2006-09-04 : - added JScore/vsp_disasm.js and updated ISM/asm.html, added a few range checks as well. - started a prototype code that saves data to files (under the user's authority). 2006-09-06 : - merged ISM and doc into doc - enhanced the save and file functions, they need to be better developped and merged. - CSS cleanup - moved text from doc/opcode_map.html to doc/assembly.html and started the description of the assembler 2006-09-06 - renamed doc/vsp_instruction2.gif to vsp_class_alu.gif, added vsp_class_jmp.gif - added the first CTL class instructions (nop, mov...) and vspsim/doc/ISM/NOP.html 2006-11-10 - starting ploped2 2006-11-18 - ploped now has a dedicated directory under /test/ploped_proto and drawsegment is moved there. - jmp instruction class still ... not finished. Some issues must be solved - trying to merge load and save functions in a single module. 2007-03-28 - the JMP instruction class is still in limbo - assembly is bork, i don't remember how i did this. - /doc/opcode_map.html#NOP didn't work, fixed by changing a stupid test. - initiated the dynamic instruction tree in /doc/opcode_map.html but kept it inside comments. - the floating asm thing did not work outside some of directories (in a fixed list), i removed the directory parsing thing in JSgui/floating_asm.js and moved the prefix to the calling page. Doing otherwise would have been too difficult in the long term. ==> In fact, now, every DHTML file should include in the header, and the footer is the usual which does the rest. Without the "prfx" variable, the directories are unreachable. 2007-04-01 - simplified the /ISM/*html files a bit more (thank you, sh/grep/sed) - PUT needs the creation of the "FORM_RI" form so i added it. - some clarification for the default values of unused register fields in JScore/vsp_asm.js (see doc/assembly.html#def ) - opcodes could use a short form, where the src2 field contains a 4-bit integer instead of a register number. Useful for EU and GET/PUT but not very... handy yet. It's something to keep in mind but the VSP's opcode space is too small, only few opcodes could use it (CTL group ?) The next architecture should have a better Imm/reg flag (reg/imm5/imm16). - initiated test/test_opcodes.html - the assembler can put the encoded instructions somewhere through the "emit_bin(data, size)" function (if defined) - DB, DH & DW pseudoinstructions are bork, while trying to extend the format. - the JMP class is still bork 2007-04-02 - test/test_opcodes.html works 2007-04-04 - DB/DH/DW pseudo-instructions now accept an unbounded list of numbers. 2007-04-05 - working on the first jmp/skip instruction group adding FORM_Q, FORM_CQR, FORM_CQRI, FORM_CIR, FORM_CIRI - adding ALIAS_IR ? - assembly.html#CIR/CIRI/Q/CQR/CQRI missing, vsp_asm/disasm.js incomplete, /ISM/J-JN-S-SN.html missing, aliases missing 2007-04-06 - added the minlength and opt_h fields to JScore/txt_int.js int2hex() because the skip length argument doesn't need the trailing 'h' - added FLAG_SKIP, FORM_QR, FORM_QRI, FORM_IRI 2007-04-07 - the jump instructions are still ... not satisfying. The fields must be moved around, again... - table_opcode[] is gaining a wider definition, to support the aliases (this didn't work because of safety measures). It should allow the aliases to have a different form than the base opcode. - JSgui/vsp_messages.js is even better (there was some race condition somewhere) - added opcode_aliases[] in vsp_opcodes.js (and populated in vsp_jmp.js) - added : ignore field (used later for EMI reductions) - test/test_opcodes.html working 100% (but with uneven syntax) --> vsp_asm.js and vsp_disasm.js are in sync --> gotta make the .js files cleaner by making all temp. vars local (to prevent name collisions and clogs) Probable future instructions : * min and max instructions are ... quite easy to make. route the 2 operands to ASU, perform substraction, XOR the Carry bit with the instructions's MIN/MAX field. the result (1/0) will enable/disable the write of the src2 into src1/dest ---> The value of src2 must be routed through another data path than ASU. * CMOV : conditions : S, Z, O, negation, of src2 value=0/imm16 written to src1/dest --> version inconditionnelle : clear * also missing : Jmp/Skip R,R (Z/C) --> FORM_(Q/I)RR | FORM_(Q/I)RI Z = Zero C = Carry / Above - missing : ISM/(J/S)(N)(S/O/E/Z).html 2007-04-09 - opcode_map.html displays all the flags - JSgui/decoration.js removed, contents moved elsewhere. - separation of Forms and Flags, because the room is getting tight. --> parts of vsp_forms.js moved to vsp_flags.js --> most files changed to take the new attribute into account --> constants ALL_FORMS and ALL_FLAGS are useless now, so they're removed. - adding the -X forms (to indicate a long instruction form where the imm16 value is ignored) --> candidates are : NOP, HALT, RETI, INV, JMP, SKIP, JO, JS, JNO, JNS, SO, SS, SNO, SNS --> new forms are X, QX, IX, QRX, IRX, RX, RRX --> new flag: FLAG_IGNORE_IMM16 - int2hex is a bit... annoying (always needing -1 in the min/max length arguments) - removed all commas in the example and disassembled codes. This makes life easier and the examples are less confusing. - vsp_disasm is too ... spaghetty. the nested if/else structure is too fragile. A better method should be used. - doc/opcode_map.html#flags and doc/opcode_map.html#forms are ok ? the "instruction classes" should be... less strict ( there's quite a waste of encoding space. ) ? the JS loading time could be reduced, when clicking on links, by using some AJAX tricks. Later, as the JS will become larger, it might save some time. 2007-04-11 - cleanup of the flags' documentation (doc/assembly.html etc.) - the core files are now listed in JSgui/js_list.js which is now loaded by most files --> now it's possible to work on the instruction group/class issue without breaking everything. - vsp_eu.js split to group_eu.js group_asu.js, group_rop2.js, group_shl.js, group_ie.js and group_misc.js - creating vsp_cmov.js - removing ADD1/SUB1/ADDC1/SUBB1 ? min/max pour les mov négatifs inconditionnels ? ? add/create a "FIELD" attribute ? (like the FORM_ and FLAG_ attributes) ? drop the use of the "instruction classes" and create more flexible "groups" of variable lenghts ? how to fill the unused conditions in the JMP group ? ? extension du champ skip à 4 bits ? ? forme Q à virer ? ? FLAG_JMP à virer, remplacé par FLAG_SKIP (???) ? MULTSTEP/DIVSTEP ? ? FLAG_QUEUE pour Qxx 2007-04-13 - JSgui/js_list.js now accepts an argument and detects an already defined add_message() - found a stooooopeed bug in vsp_disasm.js / unknown_opcode() - adding vsp_groups.js - prefix is now auto-incremented inside JScore/vsp_opcodes.js:NewOpcode() and the value parameter is removed. - stroke of genius ! ADDSx/SUBSx : skip 0 to 3 half-words if carry is generated. --> no need of useless ADDC/SUBB instructions, or of carry flag !! but could create other problems. - updated doc/vsp.html completely, asm/disasm and tests are BORK - need to be updated : ISM/*.html (touch'ed) and dump_opcode_table.js 2007-04-14 - doc/assembly.html updated (Qxx forms removed) ? Skip field is 2 bits but could be 4 bits. I prefer to keep it short for now, for HW reasons, it can still be extended later. ? instead of "Ignore Imm16"-like flags, create other flags READ_SRC1 WRITE_SRC1 READ_SRC2 WRITE_SRC2 USE_IMM16 USE_IMM0 <-- when Imm/reg=0 USE_Q USE_SKIP_CARRY USE_SKIP_COND USE_CONDITION That would simplify many, many things... Then the "ignore" mask would be ~(USE_..|USE_...|USE_...) ? instruction CIP : Current Instruction Pointer (R, IR) CIP (+Imm16) => R ? CQ -> R ? SR : MSB = 1 -> public space MSB = 0 -> private space 2007-04-15 - I tried to validate it but it breaks many things... i'll retry later. one day. http://validator.w3.org/check?uri=http://f-cpu.seul.org/whygee/vspsim/doc/opcode_map.html - added the color code to index.html - before rebuilding asm/disasm, i want to incorporate the USE_... flags. - should the tested register be SRC2 or SRC1 ?? many changes are still going to happen ! - removing FLAG_IGNORE_IMM16 - doc/vsp.html and doc/assembly.html must be reviewed because the operand order has been altered (misc, shl, ie). - /ISM/ incomplete ? inverser le sens des opérandes de shift pour faire des masques 1 bit / N bits à 1 ? - the computation of encoded_ignored_fields in vsp_asm is changed 2007-04-16 - "NOT" aliased to NAND - change the opcode_map.html code to include stats from the aliases (ie : NOT does not have the same forms as the NAND instruction) ? new instructions : "CQ", CIP, SCQ CQ : sets the destination register to the value of CQ SCQ : skips instructions according to the value of CQ (CQ=1 -> skip 1 half-word ?) CIP : reg dest = CIP(+imm16) ? new groups : PFQ flags (post-increment etc.) SMT (create/kill processes, semaphores) BITSTREAM ? ? There is no certain way to know whether an instruction is long or short just by knowing its form, for FORM_IR and FORM_I ? PFQ flag : burst/word-by-word (for I/O) 0 nothing (default) 1 nohing, no burst 2 read postinc 3 write postinc 4 read postdec 5 write postdec 6 pseudostack (read postdec, write postinc) \ read+write in the same instruction does not change the pointer 8 stack (read postinc, write PREdec) / 2007-04-17 : 10000 lines of code ! 3772 lines of Javascript, 4605 of HTML - asm/disasm/test_opcode : OK - replacing FLAG_QUEUE and FLAG_SKIP with USE_Q and USE_SKIPCOND - doc/assembly.html : flags not complete - change the MIN/MAX instructions to allow Imm/Reg (the Imm becomes the value to compare, not the value set) - opcode MOV moved to group_ie (where it looks most similar because both SWP and SRC1orIMM) - NEG alias : works, not nicely but just enough not to care. ! code examples for the conditional instructions are missing 2007-04-18 ? Skip Length : should be incremented more, counting the skip instruction's length a compromise would be to increment by 2 instead of 1. - ISM/* ok, ADDSx/SUBSx modified to account for the size of the skipping instruction ? generation of the ISM/ pages should be even more automated ! - unused bits in Imm16 are not taken into account in vsp_asm :-/ * SHL group uses only 5 bits * SB uses only 8 bits 2007-04-26 ? conditional instructions for semaphores ? ? Skip range reduced to either 1 or 2 HalfWords ? ? FIFO for the decoder, to remove instruction alignment issues ? - I've read several "old" microprocessor manuals (70s era) and found the RCA1802 (think : Voyager probe) very interesting. You could think of the VSP's CQ register (2 bits) as a sort of P register as in the RCA1802 (4 bits). The use of skips (long and short) looks similar too :-) In fact it provides with a lot of yummy coding techniques and hardware tricks ! So the VSP architecture does not only look like a mixture of the CDC6600's CPU and PPUs. Oh, and I didn't know that the Cray 2 had a specific "foreground" 32-bit CPU with 8 32-bit registers. ? shift operand and add ? (think ARM or x86's LEA) ? store the calling CQ somewhere ? in the calling CQ's pointer MSB ? ? serial boot : shift register in the instruction register ? 2007-05-13 - cleanup in the JS syntax (using some stuffs from http://javascript.crockford.com/ ) ? the X form could use numbers too ? ? creation of the tools/ directory ? (then move asm.html there) ############################################################################################### 2007-08-29 : from vspsim to yasep - vspsim/vspsim.css -> yasep/yasep.css - yasep/test/mksources/mksources.html created 2007-09-12 : "rebranding" VSP to YASEP - /vspsim/index.html reviewed - yasep/doc copied but not reviewed. ? I need a compatibility check with JS compilers - more work on mksources, i'll have to write a tokenizer. 2007-11-05 : "tonton edition" - doc, JScore, JSgui, ISM review : ok, some tests too - adding some flags to pass test_opcodes ROL, ROR, SAR, SB, SHL and SHR fail because the assembler truncates the 16-bit immediate constant. * either the asm does not truncate (but still issues a warning) * either the test uses new vector for these specific instructions [this is much better and safer for later] -> creation and support of the flags IMM16_5LSB and IMM16_8LSB - test_opcodes.html : ok \o/ 2007-11-06 : - test/test_eu.html update, with the new instruction structure ? MIN/MAX with aliased form aRI ? - implementation of MIN/MAX.action did not exist, it's ok now (ISM/MIN-MAX updated too) - MIN/MAX renamed to SMIN/SMAX, which are signed comparisons. creation of unsigned versions UMIN/UMAX - the doc is getting a bit outdated (missing forms and flags) and too large, yasep.html and assembler.html must be split into files. 2007-11-07 : - doc/ must be checked, changed file names must be propagated to other files ? missing : ASCII and string constants 2007-12-25 : - some cleanup in the doc, ISM etc. - added substitution of "MOV 0, Rx" with "CLR Rx" - trying to modify the SKIP instructions, to allow -7 to +8 jumps - SCQ modified, PFQ group populated - the Q field could be better used, allowing rotation of the queues - upgraded test_eu.html and dump_opcode_table.js to allow certain stuff to work if the code associated to an opcode is a real function. - other inconsistencies in the asm and disasm 2008-01-05 - moved test/test_eu.html and test/test_opcodes.html to benches/ 2008-07-30 - FF3 update (the floating asm window now uses negative coordinates when hidden because FF3 renders the frames differently) 2008-08-02 - renamed /doc to /docs to bypass a default Apache directory alias 2008-11-17 - added optional, 32b-only and 16b-only flags - added YASEP/YASEP16/YASEP32 pseudo-instructions to the assembler - updated docs/ and ISM/ a bit 2008-11-29 - added docs/yasep16-32.html and docs/SR.html - docs/yasep.html needs a lot of (re)work ! - Wikipedia just made me discover the M32R architecture that has similar instructions, but it was designed before 1997... - relaxed instruction alignment rules : "padding NOPs" are no longer necessary as 32-bit instructions are now 16-bit alignable. - The 2-bit Q register is dropped. R0 = next instruction's address (NIP) R1 = "control register" (auto-inc/dec etc.) Jump to register, skip (-8/+8), abs. memory address are kept but changed a bit... 0h: NIP ("Next IP", replaces A0) 1h: ST ("Status", replaces D0) 2h: A1 \ Q1 3h: D1 / 4h: A2 \ Q2 5h: D2 / 6h: A3 \ Q3 7h: D3 / 8h: A4 \ Q4 9h: D4 / Ah: A5 \ Q5 Bh: D5 / Ch: R0 Dh: R1 Eh: R2 Fh: R3 - The ASU group contains those instructions : ADD ADDS1 ADDS2 ? SUB SUBS1 SUBS2 ? 8 new instructions : compare and skip 1 or 2 half-words if (or if not) carry CMPS1 CMPS2 CMPNS1 CMPNS2 CMPU1 CMPU2 CMPNU1 CMPNU2 1 bit : distance 1 bit : signé/non signé 1 bit : négation de condition - removed : RETI ADDS3 SUBS3 group_queue (Q QZ QE QNZ QNE QO QNO QS QNS) group_pfq (CQ SCQ CIP) group_mov ==> SMIN, SMAX, UMIN, UMAX moved to MISC - group_misc (BSWAP, EXPND, MATCH, BMASK) is deactivated - the 16-bit code is not completely rewritten (group_ie.js, group_misc.js...) - conditions "always" : comparison ? - reduction of the number of conditional instruction types 2008-11-30 - missing : Jump&Link, trap - all references to D0 register must be changed to something else in the code examples. - NIP is preferred to CIP because it makes "loopentry" as easy as MOV NIP dest and Jump&Link uses the same mechanism : it copies NIP to the desired register. it's a bit like an "exchange" instruction... - issue with thread switch/restoration : * the "cached" value of the memory contents registers (D1 to D5) is not updated automatically when the new thread starts. * several reads must be performed to get the (N)IP and ST registers (well, with 2 read ports, NIP and ST are read in one cycle) and then the memory values (5 registers, 2 accesses can be done in 1 cycle, so 3 cycles are necessary) - corrected the Opera-related "bug" of the floating asm window 2008-12-18 - created the FPGA/Actel directory, but it's unpopulated yet. - benches/test_eu16.html ok ( group_ie.js completed in 16-bit version) - update of docs/yasep.html - "load linked" ? (à la MIPS pour les load/store atomiques) - missing : ABS instruction ! - trouble with ST register in 16-bit configuration : not enough bits for all the pairs, so update is only for Read AND write combined ? - could ST be put somewhere else ? and updated with a specific instruction ? - dropping pointer auto-update temporarily. 2008-12-22 - todo : merge most JS files so there are less transactions when a page is loaded 2008-12-27 - another OPERA "bug" found, after_load() must contain the JS code that must be executed after the floating assembler has finished initialisation. ==> for the opcode map or the testbenches, the Floating Asm Window is not initialised so the page continues initialisation. ==> for the others, the FAW is used and finished the page load, but OPERA does things in a different order. Files are correctly loaded but the variables are not initialised in the same order -> the opcode table is not declared... The solution is the use of after_load(). 2008-12-28 - Just got this idea : renumber the register so they are easier to group ==> "holes" (the memory windows) are gathered, they are easier to address and save and the register banks can be grouped as 3 arrays of 4 entries... 0h: R0 1h: R1 2h: R2 3h: R3 4h: NIP ("Next IP") 5h: MD 6h: A1 7h: A2 8h: A3 9h: A4 Ah: A5 Bh: D1 Ch: D2 Dh: D3 Eh: D4 Fh: D5 - Status should be renamed to "MODE" so it is less misleading. - the 5 queues are a bit annoying, maybe 4 are enough ? - some SRs are required for extended capabilities on Q2 & Q3 : - stride (value added to the A register when D is accessed - limit register - base register ==> modulo addressing for circular buffers etc. - also stack overflow and underflow registers are welcome for Q4 & Q5, with a pointer to a handling routine 2009-01-03 The 16-bit ALU is nearing completion in VHDL and many modifications will become more effective. Already, a 132MHz clock rate indicates that my conservative margins have worked beyond expectations. Also, 1/3 of the gates are pipeline gates, i'll try to do less aggressive separations of the datapaths. Yet the ALU takes around 760 tiles, i'll shave 15 or 30 at most. Also, 4 units are ready : ASU, ROP2, IE and SHL. The other functions are less critical : multiply, optional operations, eventually a muticycle divide unit... through the SRs. So the 4 groups of ALU operations deserve special treatment and a new form of instruction is created, with a 4-bit immediate value. Encoding becomes a bit more complex than the single bit that indicates a long or short instruction. Many instructions have 2 forms but the ALU instructions now have 3. With 2 bits, 1/4th of the opcodes are useless : bit 7 5 0 0 OP-reg-reg=>reg 0 1 OP-reg-im4=>reg 1 0 OP-reg-reg-im16=>reg 1 1 ??? The currently chosen solution is to create a reg-reg-reg form using 4 of the additional 16 bits but 12 bits remain unused :-/ This remains quite simple (the 3rd register operand becomes the destination register so the CDP in the beginning of decoding is not changed) and code density can be boosted, less temporary registers are needed. Note : the 3 LSB of the MODE register become critical because they can be modified with a shor (16-bit) instruction with imm4. The 4th bit is sign extended so bit 3 to 15 are less frequently used. The intended uses are synchronisation, critical sections, memory spinlocks (a la MIPS) ? The new opcode map is now split into 2 parts : * 4 groups of 8 ALU instructions that support RR, Rim4, RRim16 and RRR 1 bit of the opcode is used for the 2 additional forms. * 8 groups of 8 instructions, including 4 groups for the conditional jumps and the rest is reserved. they support only RR and RRimm16. ROP2: AND/OR/XOR/ANDN/ORN/XNOR/NAND/NOR ADD, SUB, ADDS1, SUBS1, ADDS2, SUBS2, MIN, MAX SHL : SHR, SHL, ROR, ROL, SAR ==> 3 opcodes left : MUL IE : MOV, SB, LSB, LZB (16 bits) and the 32 bits versions : SH, SHH, LSH, LZH SMIN/SMAX (signed) are not there anymore. Comparison is left for the conditional groups, mirored at some suitable address. The conditional instructions are stripped down too : the queue-related group is removed. Condition also comprises both comparisons (through ASU) and equality (through ROP2 and OR-combine). conditions : Zero, LSB, MSB, none, above, below, above|equal, below|equal all conditions can be negated. Call => jump & link Memory mapping : add a flag in the translation table to differentiate between code and data => as a 17th address bit. RWX attributes can more or less be emulated this way. Make sure that the SR-mapped multiply operations can be "restarted". Current solution : a SR register holding the result. Both operands are given by a xMULx instruction. Reading and writing back the SR_MUL_RESULT should preserve the state of an interrupted routine. A "modified" bit could be useful ? note : AVR32 has ... 58 instruction forms :-/// 2009-01-06 As the ALU stabilizes, other questions arise. The multiply unit is not yet certain but I have decided, at least for YASEP16, to make one exception to the simplicity rule, in order 1) to keep the gate count low 2) to keep the SW simple. The cost is a more complex datapath, as an additional cycle is dynamically inserted in front of the ASU. Another cost is the reservation of 2 SRAM blocks. The cost in logic tiles is then reduced to two 8-bit adders. In fact I use the 2 SRAM blocks to break down the early stages of the computations, it takes roughly 3ns to output 4 8-bit partial results. Two pairs are then combined by the 8-bit adders, and the 2 12-bit results are combined by the existing ASU16 logic in the normal pipeline. In term of instructions, at least 2 are necessary : - 1 instruction initialises the SRAM blocks (a special iterative routine must be executed when the CPU starts) - 1 instruction for multiply itself. There are only 3 instructions left in the ALU sub-group, along the SHL instructions. A 3rd instruction could be created, which multiplies another part of the input word, though this would add another MUX in the critical datapath (it's still OK). Later, when YASEP matures, these instructions will be replaced with MUL8, MUL16 and MUL32, or something like that. I'm not there right now so I just try to get to the point and have something done. Remember that YASEP is a moving target :-) ABS Rx : 4 bytes, 1 cycle Rx = 0-Rx if MSB(Rx)=0 (don't forget to detect ABS(0x8000) !) Note : the "RRR" instruction format could be extended with a conditional code ? (using "shadow properties") ==> bits 16 of the 18-bit register set can store Zero ? and what about bit 17 ? Remaining bits of the RRR form should decode to NOP NOP = MOV R0 R0 Hence 0h: R0 1h: R1 2h: R2 3h: R3 ... ==> R0 = 0 Also, why not 6 or 8 "normal" registers ? 4 "queues" (incl. stacks) => 8 regs, IP/NIP => 1 reg Mode : can be removed ? (1 LSB remains in the IP) ==> 7 registers are free To do @ JScore : - change the registers - add/update the forms and options - add support for the new extended forms - add MUL8 -- the skip length variable and the skip enable flag must be added for the simulator (see JScore/group_asu.js) -- LSB of the (N)IP == skip/accept next instruction -- jump & link... -- ROP2's opcode order will change -- assignation of SRAM blocks : * 2 (or 3?) for the register set * 2 for multiply * 2 (or 3) for the address remapping lookup ==> 1 or 2 left on A3P250, not enough for cache :-/ -- Max nr of thread context cache in SRAM : 8 ? -- after reset, and during trap/exception mode : address translation is off -- address remap LUT has only 1 port so need to read back the value --> added MUX in the datapath - opcode_map.html : add an option for Y16/Y32 only - How to fill the condition field in the RRR form : reg nr + bit nr : 4 + 5 bits => 9 bits + negation => 10 bits + zero => 11 bits skip long/short : 1 bit condition on/off : ? ==> CMOV is removed -- option for imm4 with the RRR form so conditional code can use a small displacement / Since NIP is register-accessible, JMP can be removed ! \ SKIP can be removed too if RI4R with condition is possible ! but jmp and skip have short versions \o/ The 4 forms could be extended to the rest of the opcode map ? difference between JMP and SKIP : SKIP is a short relative (forward) jump, JMP is an absolute jump JMP and SKIP can compare 2 values and use the full 2 operands to enable/avoid the program control change. however a field is still needed for the register source/skip amount, and comparison with ... immediate ? And what about Jump And Link ? There are only 32 opcodes for these :-/ JMP unconditional with negative condition == Jump & Link \o/ Conditional form : 2 register banks, the 2nd is fed with the cond. address a cycle later => condition computation takes 1 sub-cycle (2 max) while normal computation proceeds in parallel in 3 subcycles * Register map : R0 R1 R2 R3 R4 R5 R6 (mode ?) IP/NIP D0\ A0 A0/ A1 D1\ A2 A1/ A3 D2\stack2 D0 A2/ D1 D3\stack D2 A3/ D3 "MODE" and other registers : as "shadow" of Dx during context swap * Dx is written both to the register set and memory * Dx is read back when context is restored, from Ax * Mode is written to memory when context is switched * Mode is read back but sent to a "shadow" register 2009-01-07 Conditional word of RRR form : 4 : Rdest \ same places as other register fields 4 : tdest / (as it is piped one cycle later) 1 : imm4/reg on Rsrc of the previous half-word 2 : Condition Always Zero LSB MSB 1 : negate condition (not always : ?) ==> same place as with other conditional instructions Multiply : needs a scratch register / accumulator. 8x16 multiply : R0 x R1 => R2-R3 (R4 = scratch) YASEP16 : 6 instructions ; 2nd half MUL8H R0 R1 R2 SHR 8 R3 ; adjust between R2 and R3 SHL 8 R2 ; first half MUL8L R0 R1 R4 ADDS1 R4 R2 ADD 1 R4 16x16 Multiply : R0 x R1 => R2-R3 (R4=scratch) YASEP16 : 14 instructions MOV 0 R3 ; middle bytes MUL8H R0 R1 R2 MUL8H R1 R0 R4 ; Notice the exchange of operands ADDS2 R4 R2 MOV 100h R3 ; pre-carry SHR R2 8 R4 ; adjust between R2 and R4, SHL 8 R2 OR R4 R3 ; and put the carry back into R3 ; lower byte MUL8L R1 R0 R4 ADDS1 R4 R2 ADD 1 R3 ; higher byte ROL 8 R1 MUL8H R1 R0 R4 ADD R4 R3 With YASEP32, the larger registers make the carry etc. less troublesome. But YASEP32 will probably include a fused 16x16 multiplier...... and YASEP16 definitely needs MUL8H, which only adds a MUX to one LUT input. 2009-01-18 - Enhancing the inline assembly : the contents of the URL is regenerated with the contents of the text (to prevent copy/paste incoherences), and assembly and disassembly are separated a bit (different code and color) - A new function is created in JSgui/link_opcodes.js, which further reduces writing efforts and size. - name of the 4 forms : - short register (normal) - short immediate (new) - long immediate (normal) - long register, long register conditional (new) 2009-01-23 - A new interactive assembler interface is appearing in yasep/test/listed. - a new directory appears : tools /docs/asm.html and /docs/opcode_map.html moved there. ==> all links to the assembler should be of class "asm", and to the opcode map : "opcode" (the reduces the risks of incoherencies and there is less work to do if something moves or changes again) - from now on, every tool or aspect should be designed in such a way that they can be integrated in a
in another page. In the end, everything will be loaded in the main index.html page. search engine compliance goes to hell too. - in fact, most links should be converted to so the actual links can be modified in one place. The JavaScript that "patches" the code does the interim work. - the floating asm and the static page should be better separated. - changes to setTimeout calls JS and optimisation : - http://dev.opera.com/articles/view/efficient-javascript/?page=3 - create something that concatenates all the JS files (and strips spaces etc.) to reduce download activity and latency on yasep.org's server ==> make a script ? - make yasep's structures into an object ("CPU" ?) to reduce the nbr of global variables 2009-03-24 I just read http://www.gnu.org/philosophy/javascript-trap.html from /. and I'll apply the principles on the YASEP code, once FSF disambiguifies the recommendations. In the source files : /* @Copyright (C) 200x Yann Guidon @licensetype AGPLv3 @licenseURL http://yasep.org/license/agpl.txt */ In the compacted files : //@source: URL 2009-04-07 - replaced ADDS1/ADDS2/SUBS1/SUBS2 with COMPU/COMPS/SMIN/SMAX the functions are still missing and the VHDL does not have the signed overflow code. COMPU & COMPS pages of ISM must be written. - PC is now "Next PC" (NPC) because it's the most used data (PC remains available and gets copied to a SR when an instruction trap is triggered) -------------------------------------------------------------------------------------------- http://news.yasep.org/ what about YASEP2009 ? By whygee on Thursday 19 March 2009, 14:50 - Updates and news Development of and around YASEP is going on in a weird way, but it still continues... Why so much caution ? Because the changes to the architecture are quite deep. The instructions forms are increasingly complex and I've pushed the design beyond what I intended in the beginning. If you don't remember, YASEP had only two ways to address data previously : short form : Reg1 OP Reg2 => Reg1 (16 bits) long form : Reg1 OP Imm16 => Reg2 (32 bits) Now a few bits are freed and this gives much more "flexibility", so I added : Short Immediate : Reg1 OP Imm4 => Reg1 (16 bits) Long Register : Reg1 OP Reg2 => Reg3 (32 bits) And because there was still some room, this last form has more elaborate versions : Long conditional : Reg1 OP Reg2 IF{NOT} Reg4{LSB/MSB/Zero/ready} => Reg3 (32 bits) And other versions come up when the Reg2 field is interpreted as Imm4 : Long conditional short Imm: (excuse the name) Reg1 OP Imm4 IF{NOT} Reg4{LSB/MSB/Zero/ready} => Reg3 (32 bits) Or without condition : Reg1 OP Imm4 => Reg3 (32 bits) This applies to the computation instructions, the control instructions are still too undefined yet. Code density should increase, which is worth the efforts. I don't know if it will reach the level of ARM or x86 but it is certainly a major advance. However, this breaks a lot of the assembler's mechanisms, so I prefer to rewrite it. This takes a while because the rest must be adapted too : the Instruction Set, the manual pages, the validators... If you can't stand the wait, have a look at the current broken version at http://yasep.org/~whygee/yasep2009/, at least it is more recent than the main site. -------------------------------------------------------------------------------------------- Yet another Instruction Set Architecture change By whygee on Saturday 4 April 2009, 14:36 - Architecture I wish it could stabilize soon, but at least movement is a sign of activity (or the reverse :-)) I was annoyed by the ASU operations : ADD, SUB, ADDS1, SUBS1, ADDS2, SUBS2, MIN, MAX These instructions were the last ones that used skip technique, since it is progressively dropped in favor of relative branches by conditional add/sub to the PC register. How is it possible to provide the same functionality without skip ? It's the same old question that decades of research has not yet answered definitively. The Carry Flag is the obvious solution but I have just dropped the "status/mode register" in favor of another general purpose register. So where can I find a stupid bit of room ? The answer is there under my eyes : the LSB of the NPC ... OK OK I know it's ugly. But consider these aspects : * The PC points to the next instruction and never uses the LSB because all the YASEP instructions are aligned on 2-bytes boundaries. * Any write to the PC register modifies the bits 1 to 31. Bit 0 comes from the ASU's carry output. * We can declare that only the ASU operations (or context changes) can change the PC's LSB. All the other instructions can read it and test it, so the informations is easily available. * Since we dropped the 4 instructions that used skip, these "slots" can be filled by other instructions : CMPS, CMPU, SMIN, SMAX CMPx are just like SUB but don't write the result back. I wish it could set the LSB of any register but the current architecture doesn't allow this, so please keep the destination field to PC when encoding the assembly instruction. 3 new instructions deal with signed comparison : CMPS, SMIN & SMAX. They were missing from the previous opcode maps but the elimination of the skip-instructions leaves enough room. I have to update the VHDL now... * Keeping the carry bit in the LSB of the PC can have a curious side effect : relative jumps with odd values will make the carry bit ripple to the other bits of the result, so the destination address that is written in the PC will depend on the value of the carry bit. In practice, there is no speed or size advantage (compared to condition codes in the new opcode extension) but the possibility is there... * Clearing the carry flag is done with CMP Rx, Rx * Setting the carry flag is done with CMP -1, Rx (or something like that) Usually, I would end the post with something along the lines of "this is good and everybody is happy". Now, I feel a bit disapointed that YASEP looks more like other architectures, and has less distinguishing features. It is less groundbreaking and it will have to face the same problems as the others, on top of its inherent quirks. But it's still better than nothing and I do my best to keep the system rather coherent and orthogonal. -------------------------------------------------------------------------------------------- First details of the new "extended" long instruction By whygee on Saturday 4 April 2009, 16:31 - Architecture A precedent post has summarised the available "instruction forms", with or without immediate field (4 or 16-bits), with 2, 3 or 4 register addresses. Here we look at the "long form" (32-bit) using the "extended" fields that add 2 register addresses, conditional (speculative) execution and pointer updates. Let's now examine the structure of the 16 bits that are added to the basic instruction word : * One bit indicates if the source is Imm4 (it replaces the corresponding field in the basic instruction). * 2 bits indicate a condition (LSB, MSB, Zero, Always) * another bit negates the result (The condition "never" will be used later but I'm not sure how). * 4 bits indicate which register is being tested * 4 bits indicate the destination register (replacing the src/dest field in the basic instruction) * 2 fields of 2 bits each encode the auto-update functions of one source register and the destination register (nop, post-inc, post-dec, pre-dec) These fields are mostly orthogonal and can work in almost any combination. One can auto-update 2 registers (whether they are normal or belong to a memory access register pair), perform a 3-address operation and enable write-back depending on 97 conditions. It also preserves the availability of short immediate values, which further reduces code size. However it can increase the core's complexity. One unexpected bonus is that this new architecture iteration is more compiler-friendly. At least, it's much less awkward or embarassing. One bit could have been saved : the imm4 flag could be merged in the auto-update field for a source register. However this increases the logic overhead and prevents simultaneous use of auto-update AND imm4. Stay tuned... -------------------------------------------------------------------------------------------- 2009-05-26 - YASEP16 just got the register set and synthesises to > 90 MHz, enough for 12ns SRAMs. - moved MULxxx to a specific group (il will be merged later...) - distilled some of the newest changes in the core files : conditional stuff, extended forms... but still a lot of work to do. - constants : add alphanumeric/ASCII ? and explicit long/short specifier 2009-06-01 : - moved /test/ygwm, /test/minifier and /test/listed to / beware of symlinks because they don't get ported to windows - working on /filefox, data backup seems almost OK, I'm refining it now. it should get integrated in ygwm - trying to export the opcodes and instruction fields to VHDL 2009-07-06 - changed some CSS colors - created the /obsolete directory, moved old stuff there. - the documentation MUST be rewritten - TODO : ASCII text constants are still missing - pages à faire : registres, formats d'instructions (DONE) - some updates to /docs/assembly.html, not finished - moving ygwm and filefox to JSgui - moving listed to tools 2009-07-07 - /fr directory removed, Laura proposes to rename candidate files as *_fr- then _fr when finished. The translated files remain in the same directory to avoid breaking the links and paths. - "never" condition => call ? and what about the free source register read field ? 2009-07-09 - playing with JSgui/js_list.js * later, all the JS files will be minified into 1 file (the CSS too !) * tested/hacked files are renamed with a -2 suffix * prepare a way to have several message windows on screen => message_window object ? * remove JSgui/link_opcodes.js later as it is (conditionaly) integrated in page_pre.js * avoid the update of docs/assembly.html * FLAG_NOEXT => forme étendue impossible ou équivalente à forme courte ? * FLAG_SWAPDEST à revoir / refondre !!!!!!!!!! BIG MIX : SRC1 <> SRC2 fields are not coherent in the documentation !!!!!!!!!!! 2009-07-19 * At Laura's request, I'm adding aliases to the load/store instructions, so the semantic as insert & extract is clear. SB -> IB LZB -> EZB LSB -> ESB SH -> IH SHH -> IHH LZH -> EZH LSH -> ESH 2009-07-22 opcode flag ==> attribute ? 2009-07-23 columns can be hidden in listed TODO (DONE) : "objectify" the assembler, disassembler and CPU description. 2009-07-27 the assembler has been "object"ified and the constructor is Yasep_asm 2009-07-28 the whole CPU definition is objectified as "Y" TODO (DONE) : - The src1 and src2 fields are messed up all over the code, they must be checked carefully on the old gif, src1 is bits 12-15, but it's now bits 8-11 (exchanged with src2) but src2 is negated (it's src1 now) and src1 is mux'ed with Imm16 (src2 now) I don't know when/how the swap happened. VSP05.txt says "bits 8-11 : source/dest register number" so only the name, not the place, has changed. - then the flags (swap_dest for example) must be checked - then the disassembler can be restored - then the extended forms should be supported ygwm & the floating asm window can be disabled : write "disable_ygwm=true;" next to the definition of "prfx" this should shorten some page's loading^Wrendering time a little bit. and it's compatible with minification. 2009-07-29 : the forms with i are better supported TODO (size reduction of the archives) (DONE) : - convert from DOS format (remove one byte per line) - remove duplicate "version" words in headers note : now we have a 3-register form (RRR or RIR or RiR) so there is no need to overwrite the substractand (like with PICs) ==> SUB is now marked as SWAP_DEST (could also be done for ADD since it's a commutative operation) added new flags : ALIAS_RIR & IgnoreImmSign 2009-07-30 benches/test_opcodes.html : mauvaise gestion des alias => désactivée TODO : new core diagram that replaces docs/yasep_pipeline2007.gif (already replaced by yasep2009.gif) rename the ambiguous "src1" and "src2" with "si4" and "snd" created : docs/instructions.js renamed FLAG_ALIAS_RR to ALIAS_RR renamed FLAG_SWAPDEST to SWAPDEST updated ISM : ROL/ROR/UMIN/UMAX/SMIN/SMAX 2009-08-04 : @Vila ca \o/ * added flag NO_WRITEBACK * updated registers(_fr).html * READ_SRC1orIMM : removed it is implicit and always speculatively performed. so it's easier to define the reverse condition, when it appears. - IGNORE_SND - IGNORE_SI4 - ... ? * removed USE_IMM16 : redundancy with ALIAS_RR (NEG and NOT only) * READ_SRC1 is not used => removed * READ_SRC2 seems useless => removed * Y.WRITE_SRC1 removed , too... * JScore/group_eu2.js objectified and Y dropped 2009-08-08 Done : JScore/group_asu2.js is redesigned. * todo : add the "signed" input port to the VHDL code of ASU : this will enable/disable the input XOR of the 15th bit. cost : 2 AND2 gates ? * TODO (DONE) : aliases for the conditions : if_borrow if_carry if_no_borrow if_no_carry => substitution before the asm ? to be done (again) : (DONE) - the flags (swap_dest for example) must be checked - then the disassembler can be restored - then the extended forms should be supported 2009-08-09 group_shl : removed FLAG_SWP ready : SHL, ROP2, ASU, MUL must be updated : CTL, RSV, IE => IGNORE_SND, IGNORE_SI4 * TODO check that the fields are OK for IE, JS vs VHDL 2009-08-10 * rebuilding the disassembler. 0 error in the opcode autotest. * added Y.IGNORE_IMM16 (redundant with Y.FORMS_X ?) * F4 and F8 defined early in yasep_fields2.js so it's used mostly everywhere * removed SWAPDEST (only used by ADD/SUB...) * TODO : opcode fuzzer ? - ALIAS_RR == FORM_R ? - FORM_IR : what fields are really used ? * new flag SWAP_IR 2009-08-12 * starting the extended instructions * RiR => iRR (si4 first so "short forms" can be easily "promoted" as extended when a condition is specified) 2009-08-15 Win2K HD crash, several VHDL files are unavailable. * the tests must be updated to std_ulogic * operands DataA & DataB must be changed to SI4 & SND SHL, IE : ok ASU : changed DataA, DataB for SI4&SND, updated for signed comparisons : if (MulMux = '0') then ActualA := (SI4(15) xor signed_comparison) & SI4(14 downto 0); ActualB := (SND(15) xor (Addsub and (not signed_comparison))) & (SND(14 downto 0) xor (14 downto 0=>Addsub)); else ActualA := "0000" & AuxLo; ActualB := AuxHi & "0000"; end if; test_diff : in the test n°0, equivalence is OK when addsub <= AddSub and not (mulmux) signed_comparison <= signed_comparison and not (mulmux) (because some optimisations in the MUX break the thing otherwise) MUL8x4 : changed the polarity of WrEn and MulEn so they are active when 1 changed val to init MULI : found the algo for the initialisation of the LUTs : R1 : SND (first address + outer loop counter) R2 : SI4 (second address (lower byte) + init value (higher byte)) R3 : accumulator : second address increment + init increment (higher byte) R4 : inner loop counter A0 : inner loop address A1 : outer loop address mov 0 R1 mov 11h R3 mov 1 R4 mov NPC A1 ; outer loop 16 times : mov 0 R2 mov NPC A0 ; inner loop 16 times : ADD R3 R2 MULI R2 R1 ror 1 R4 mov A0 NPC LSB0 R4 add 100h R3 add 1011h R1 mov A1 npc no_carry ; the end ==> created docs/multiply.html * changed RIR to IRR everywhere * TODO : signed multiply * TODO (DONE) : revert the filenames back to without the 2 postfix in yasep/JScore * TODO : add another field in the LOAD instructions so unaligned accesses are possible in RRR form (one R holds the value of the precedent register) 2009-08-16 - starting to implement the conditional instructions. - swapped Y.FIELD_EXTSRC4 and Y.FIELD_EXTDST3 : EXTDST3 is now 16 bits away from SND, EXTSRC4 is 16 bits away from SI4. This should spare a MUX or two in the decoder. * TODO : docs/assembly_fr.html must be translated (only started, quickly stalled) - created JScore/yasep_conditions.js * IDEA : the condition codes do not use the src4 fields for the ALWAYS and NEVER codes. => ALWAYS is condition 0 with src4=0. The rest could be used ... src4 could select one bit amond 15 (bit#0 is stuck to 1) the bit could come from either I/O pins or a register (SR ? what about context change ?) 5 conditions could be used later, linked to the 5 memory register pairs, so specific code can be executed when the memory is not ready, or if the value has been changed/altered by another thread (for example). * TODO : align pseudo-opcode ? * TODO (DONE) : exchange SI4 & SND, or DST3&SRC4 again ?? (it seems that I made a mistake earlier) 2009-08-17 - the instruction form examples are now random. They change at every page reload. it's one first step towards a fuzzer... TODO : the instruction decoder should be better factored 2009-08-18 - dans le bus de retour de Vila Ca pour l'opcode-autotest, les instructions qui ne passent pas sont : - LZH, LZB, LSH, LSB : RRX ==> décode comme RR ?? - INV, CRIT et HALT : * FORM_ALONE conditionnel => décodage marche pas * FORM_X décodé comme IRR idée : éliminer les FORM_X et encoder des formes étendues à la place. ça élimine tous les FORM_X et on met "always" comme condition à la place. par contre c'est pas réversible donc l'autotest marchera pas, il pourra pas savoir si un "always" a été mis puisqu'il est par défaut... 2009-08-23 De toute façon, les formes "X" sont chiantes et inutiles, pas la peine d'encombrer le désassembleur et l'opcode map avec ça. reste aussi à remettre les champs SRC4 et DST3 correctement. TODO : fenêtre de messages avec boutons pour accepter les messages d'erreur/warning/etc. le désassembleur est quand même dans un sale état. --- idea : use the 0xA0 bytes in the JS strings that contain contiguous spaces to avoid removal of spaces during minification. => The french pages won't allow this because of the encoding, so I have to change the encoding. 2009-08-24 * TODO : abstract/vendor independent versions of the units => VHDL Versions of the arrays * TODO : ABS alias ABS R1 => SUB 0 R1 R1 MSB1 R1 ABS R1 R2 => SUB 0 R1 R2 MSB1 R1 ==> signed multiply : - need another tmp reg (stack ?) xor R1,R2,t abs R1 abs R2 (mul16) return si MSB0 t neg Res return soucis : comment ajuster la sortie sans faire de ABS en entrée ? comment faire le NEG d'une paire de registres ? comment faire cela pour toutes les tailles et combinaisons avec immédiats ? neg 32 bits avec op 16 bits : neg Rlow and 1 PC Rt sub rt, Rh, rh 2009-08-29 Multiply : available in 2 versions (when available) * When the LUT method is used, 3 instructions are provided : MUL8L, MUL8H, MULI * When a HW multiplier is available, these instructions are implemented : UM16H, UM16L, SM16H, SM16L These methods exclude each other, so they share the same 4 opcode values. The sharing is managed with aliases. A JS flag in the CPU object will determine which opcode to use. The 4 following opcodes are reserved for division. 2009-08-30 * adding the new "YASEP configuration panel" as a floating window -> There are now 2 kinds of properties : "build" and "runtime" for multiply, datapath size etc. * "build time" properties are used for VHDL generation * "buildtimes" are copied to "runtime", which can be changed during assembly * the floating asm window's contents is now generated after load time, so the red message does not appear/flash anymore when a page is loaded. I use the new DOM method for the confpanel as well, and the other/next windows will do too. * instructions that read and write to another register bank/thread ? * onchip memories for FPGA made with BlockRAM ? => make parameterised VHDL that takes a certain amount of block RAMs and assembles them into a larger memory array. - They won't be very "large" (some KBs) so no need of remapping blocks. - dual port is possible so simultaneous instruction+data is possible => pipeline faster - wide datapaths make buffering/caching possible => preparation of newer architectures => A3P125/A3P250/AFS250 : 2 for R7, 2 for MUL, 4 remain for SRAM => 2KB of SRAM A3P400 : 4KB A3P600, AFS600 : 8K A3P1000 : about 15K AFS1500 : about 30KB ! * IDEA : addresses FFF8 to FFFF are reserved as scratch pads. they can be used when a D register serves as a R register, so A0=0, A1=1, etc. in fact, it uses the sign extension of the constant field to avoid overwriting the boot code at address 0 : A1=-1, A2=-2, A3=-3, A4=-4 => this fits into short instructions warning : when possible, use the thread's stack to avoid concurrency issues, and beware of address remappings and threads... this makes a long instruction : ADD -1, Astack, A1 ADD -2, Astack, A2 ADD -3, Astack, A3 ADD -4, Astack, A4 => Astack=A0 ? 2009-09-02 : * TODO : s/YASEP/the YASEP/ , s/YASEP/le YASEP/ 2009-09-20 : - TODO : s/SULV/SLV/ in VHDL and generator code - Problem : the GET/PUT will take a LOT of time, several cycles, maybe even a variable time :-( idea : GET/PUT behaviour : blocking access when index is negative ? bad because the behaviour is not known at opcode decode time, but at read time stall signal is necessary :-/ write instruction will not stall because it's the read that takes time with the big MUX/AOx 2009-11-6 * slashdot.org linked to http://closure-compiler.appspot.com/home and I'm playing a bit to see how to make my code better. - 'const' are not allowed ? o_O - ygwm seems to have a duplicate ev function parameter in .hook() => fixed // ==ClosureCompiler== // @compilation_level SIMPLE_OPTIMIZATIONS // @code_url http://yasep.org/JSgui/page_pre.js // @code_url http://yasep.org/JSgui/filefox.js // @code_url http://yasep.org/JSgui/floating_asm.js // @code_url http://yasep.org/JSgui/yasep_messages.js // @code_url http://yasep.org/JSgui/ygwm.js // ==/ClosureCompiler== So it's good to spot otherwise uncaught JS troubles but closure-compiler will not replace my custom scripts because - it requires internet access - usage is limited - CSS & HTML are not processed - google's policy is not certain for the long term - one can't use the compiler on his own computer - the scripts already provide 80% of the compiler's gains with minimum efforts so closure appears as overkill 2009-11-11 I just discovered http://www.dinceraydin.com/lcd/index.html from wikipedia, and particularly the simulator : http://www.dinceraydin.com/djlcdsim/djlcdsim.html and I wonder how it could be integrated or linked with the YASEP simulator. Trying to contact the author, who has even made a JS PIC ASM :-D http://www.dinceraydin.com/pic/djpasm/djpasm.html Also interesting : http://home.iae.nl/users/pouweha/lcd/lcd0.shtml http://www.8052.com/tutlcd2.php 2009-12-01 /. : http://wiki.commonjs.org/wiki/CommonJS Also : the main clock is now defined as 3.6864MHz so the clock consumes less than a canned oscillator at 25MHz. RS232 : the baud rate is a simple division by 2 1843200 921600 460800 \ 230400 - OK for USB/Linux communication 115200 / 57600 28800 When divided by 3, it generates 1.2288MHz : 614400 307200 153600 76800 38400 \ 19200 \ standard rates 9600 / 4800 / So a 10-bit baud ratio register is enough. RTC : divide by 225 (5*5*3*3) and get 16384KHz => a 14-bit counter gives a direct reading of the current second's time => A 14-bit "mask" register can trigger a thread to pop up every 2^-n second. => This could also trigger A/D conversions of accelerometers Sound : multiply by 10 and divide by 3 : 3.6864 * 10 / 3 = 12.288MHz => 48KHz * 256 or multiply by 5 : 18.432MHz => 48KHz*384 (another common ratio) 44100Hz (2*2*3*3*5*5*7*7) is too complex to get. CPU : the PLL can be started with a low multiplier that is then dynamically tuned to match the SRAM's speed and/or workload. The RTC will still trigger the events based on the second, not the CPU's clock counts. With a 3.6864MHz base clock, the CPU speed can be finely adapted, from this up to about 100MHz with tens of intermediary steps ! Pour la calibration : 1 source 1Hz, 1 timer 24 bits et 1 sortie sur LCD pour le nb d'impulsions par seconde. * émulateur "microterminal" pour LCD ? dTCXO : - capteur température SPI ? - source 1Hz (GPS) - sortie DAC ? - 1 "timer" 32 bits avec entrée sélectionnable, + registre auxiliaire 10MHz = 2^7 * 5^7 3.6864 = 2^14 * 3^2 * 5^2 5^5 \ * 2^7 * 5^2 2^7 * 3^2 / 2010-01-17 * Oscillator is mostly OK, though not yet functional. I have 18.432 and 3.6864MHz crystals in store with most of the supporting parts. * TODO : support GHDL * TODO : create 2 VHDL packages so wires types can be SUL or bit, buses can be SULV or bit_vector => speedup of GHDL simulation ==> define YASEP_BIT, YASEP_VECTOR and conversion functions 2010-01-18 * TODO : compatibility.html : list the browsers that work and the known display bugs 2010-02-12 * discovered the HTML5 'canvas' and screenshot capabilities this is going to be a great tool for display emulation for the simulator :-) 2010-02-21 * added some alphanumeric LCD stuff, mainly a character editor and character bitmap table. /test/ is a real mess (I have added a lot of random stuff found on the 'net) so I'm not releasing anything yet. * TODO : finish the configurator at tools/generate_VHDL.html and integrate it in listed 2010-03-11 * TODO : add a new pseudo-instruction "assert" (reg/mem/sr) = (reg/mem/imm/sr) * TODO : changer SLV en ... ? YV : YASEP Vector ? 2010-03-17 -FORM_IR MOV 3587 R0 113: OK: opcode=MOV form=FORM_IR 4 bytes mask=FFFFF0FFh 114: OK: opcode=MOV instruction="NOP" (FORM_ALONE) 115: output != input * TODO : configurer la carte de la memoire, nb de bits d'adresse * fumble avec les encodages (UTF-8) sous fedora et noms de fichiers en minuscules :-( * miror @ tuxfamily.org new directory : logo contains http://faq.tuxfamily.org/images/Btn_tf2.png * TODO : code for bitcount with the MUL instructions and LUT ? problem : the adds are shifted * TODO : in Listed : add a search window, to locate occurences of a word in the edited source code * TODO : separate DATA and INSTRUCTION RAM spaces to accelerate the instructions fetch and reduce the memory bottleneck. * TODO : port VHDL-POSIX to GHDL 2010-04-19 * TODO : bridge from SR to Wishbone and other I/O buses