diff --git a/system/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/nanosoc-ADP-validation.ipynb b/system/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/nanosoc-ADP-validation.ipynb index 9efb3c883a8f259364b8f9d313c6e2fdfb99950b..5026330001cae9fd0d4bc810e1a45dffa18f7efc 100755 --- a/system/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/nanosoc-ADP-validation.ipynb +++ b/system/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/nanosoc-ADP-validation.ipynb @@ -302,7 +302,7 @@ "name": "stdout", "output_type": "stream", "text": [ - " 0x50c1ab03\n", + " 0x50c1ab04\n", "\r\n", "\n", "\n", @@ -416,15 +416,12 @@ "output_type": "stream", "text": [ "file size in bytes is 7192\n", - "file pad in bytes is 0\n", - "file size in words is 1798\n", - "file size in words is 0x706\n", - "U 0x706\n", + "U 0x1C18\n", "\n", "7192\n", "0\n", "?\n", - "]U 0x00000706\n", + "]U 0x00001C18\n", "]\n" ] } @@ -434,16 +431,12 @@ "file_name= \"arm_tests/aes128_tests.bin\"\n", "file_stats= os.stat(file_name)\n", "file_len_in_bytes = file_stats.st_size\n", - "file_len_in_words = int((file_len_in_bytes + 3)/4)\n", - "file_pad_in_bytes = (file_len_in_words * 4) - file_len_in_bytes\n", "print(f'file size in bytes is {file_len_in_bytes}')\n", - "print(f'file pad in bytes is {file_pad_in_bytes}')\n", - "print(f'file size in words is {file_len_in_words}')\n", - "wordcount_hex=hex(file_len_in_words)\n", - "print(f'file size in words is {wordcount_hex}')\n", - "print(f'U '+wordcount_hex+'\\n')\n", + "bytecount_hex=hex(file_len_in_bytes)\n", + "print(f'file size in bytes is {bytecount_hex}')\n", + "print(f'U '+bytecount_hex+'\\n')\n", "adp.write('A 0x20000000\\n')\n", - "adp.write('U '+wordcount_hex+'\\n')\n", + "adp.write('U '+bytecount_hex+'\\n')\n", "count = file_len_in_bytes\n", "print(count)\n", "with open(file_name, mode='rb') as file:\n", @@ -451,11 +444,6 @@ " b=file.read(1)\n", " adp.wbyte(ord(b))\n", " count-=1\n", - "count = file_pad_in_bytes\n", - "while (count>0) :\n", - " b=0\n", - " adp.wbyte(b)\n", - " count=count-1\n", "print(count)\n", "print(adp.read(100))" ] @@ -627,7 +615,7 @@ "text": [ "C 0x00000200\n", "\r", - "] 0x50c1ab03\n", + "] 0x50c1ab04\n", "\r\n", "\n", "\n", diff --git a/system/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/nanosoc-ADP-validation.ipynb b/system/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/nanosoc-ADP-validation.ipynb index 9efb3c883a8f259364b8f9d313c6e2fdfb99950b..5026330001cae9fd0d4bc810e1a45dffa18f7efc 100755 --- a/system/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/nanosoc-ADP-validation.ipynb +++ b/system/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/nanosoc-ADP-validation.ipynb @@ -302,7 +302,7 @@ "name": "stdout", "output_type": "stream", "text": [ - " 0x50c1ab03\n", + " 0x50c1ab04\n", "\r\n", "\n", "\n", @@ -416,15 +416,12 @@ "output_type": "stream", "text": [ "file size in bytes is 7192\n", - "file pad in bytes is 0\n", - "file size in words is 1798\n", - "file size in words is 0x706\n", - "U 0x706\n", + "U 0x1C18\n", "\n", "7192\n", "0\n", "?\n", - "]U 0x00000706\n", + "]U 0x00001C18\n", "]\n" ] } @@ -434,16 +431,12 @@ "file_name= \"arm_tests/aes128_tests.bin\"\n", "file_stats= os.stat(file_name)\n", "file_len_in_bytes = file_stats.st_size\n", - "file_len_in_words = int((file_len_in_bytes + 3)/4)\n", - "file_pad_in_bytes = (file_len_in_words * 4) - file_len_in_bytes\n", "print(f'file size in bytes is {file_len_in_bytes}')\n", - "print(f'file pad in bytes is {file_pad_in_bytes}')\n", - "print(f'file size in words is {file_len_in_words}')\n", - "wordcount_hex=hex(file_len_in_words)\n", - "print(f'file size in words is {wordcount_hex}')\n", - "print(f'U '+wordcount_hex+'\\n')\n", + "bytecount_hex=hex(file_len_in_bytes)\n", + "print(f'file size in bytes is {bytecount_hex}')\n", + "print(f'U '+bytecount_hex+'\\n')\n", "adp.write('A 0x20000000\\n')\n", - "adp.write('U '+wordcount_hex+'\\n')\n", + "adp.write('U '+bytecount_hex+'\\n')\n", "count = file_len_in_bytes\n", "print(count)\n", "with open(file_name, mode='rb') as file:\n", @@ -451,11 +444,6 @@ " b=file.read(1)\n", " adp.wbyte(ord(b))\n", " count-=1\n", - "count = file_pad_in_bytes\n", - "while (count>0) :\n", - " b=0\n", - " adp.wbyte(b)\n", - " count=count-1\n", "print(count)\n", "print(adp.read(100))" ] @@ -627,7 +615,7 @@ "text": [ "C 0x00000200\n", "\r", - "] 0x50c1ab03\n", + "] 0x50c1ab04\n", "\r\n", "\n", "\n", diff --git a/system/test_io/verilog/nanosoc_adp_manager.v b/system/test_io/verilog/nanosoc_adp_manager.v index 2d7b0df615beec22eace9c16af132463dbe5494c..cf6c0d850b0f50781599a489030b5b37761179e1 100755 --- a/system/test_io/verilog/nanosoc_adp_manager.v +++ b/system/test_io/verilog/nanosoc_adp_manager.v @@ -11,7 +11,8 @@ //`define ADPBASIC 1 -//`begin_keywords "1364-2001" + +`define ADPFSMDESIGN 1 module nanosoc_adp_manager // AHB initiator interface #(parameter PROMPT_CHAR = "]" @@ -32,20 +33,16 @@ module nanosoc_adp_manager // AHB initiator interface // COMIO interface output wire [ 7:0] GPO8_o, input wire [ 7:0] GPI8_i, -// input wire COM_RXE_i, input wire [ 7:0] COMRX_TDATA_i, input wire COMRX_TVALID_i, output wire COMRX_TREADY_o, -// input wire COM_TXF_i, output wire [ 7:0] COMTX_TDATA_o, output wire COMTX_TVALID_o, input wire COMTX_TREADY_i, // STDIO interface -// input wire STDOUT_RXE_i, input wire [ 7:0] STDRX_TDATA_i, input wire STDRX_TVALID_i, output wire STDRX_TREADY_o, -// input wire STDIN_TXF_i output wire [ 7:0] STDTX_TDATA_o, output wire STDTX_TVALID_o, input wire STDTX_TREADY_i @@ -64,7 +61,7 @@ wire STD_RXE_i = !STDRX_TVALID_i; `ifdef ADPBASIC localparam BANNERHEX = 32'h50c1ab01; `else - localparam BANNERHEX = 32'h50c1ab03; + localparam BANNERHEX = 32'h50c1ab04; `endif localparam CMD_bad = 4'b0000; @@ -145,87 +142,66 @@ input [7:0] char8; FNuppercase = (char8[6]) ? (char8 & 8'h5f) : (char8); endfunction -function [63:0] FNBuild_param64_hexdigit; -input [63:0] param64; -input [7:0] char8; -case (char8[7:0]) -"\t":FNBuild_param64_hexdigit = 64'b0; // tab starts new (zeroed) param64 -" ": FNBuild_param64_hexdigit = 64'b0; // space starts new (zeroed) param64 -"x": FNBuild_param64_hexdigit = 64'b0; // hex prefix starts new (zeroed) param64 -"X": FNBuild_param64_hexdigit = 64'b0; // hex prefix starts new (zeroed) param64 -"0": FNBuild_param64_hexdigit = {param64[59:0],4'b0000}; -"1": FNBuild_param64_hexdigit = {param64[59:0],4'b0001}; -"2": FNBuild_param64_hexdigit = {param64[59:0],4'b0010}; -"3": FNBuild_param64_hexdigit = {param64[59:0],4'b0011}; -"4": FNBuild_param64_hexdigit = {param64[59:0],4'b0100}; -"5": FNBuild_param64_hexdigit = {param64[59:0],4'b0101}; -"6": FNBuild_param64_hexdigit = {param64[59:0],4'b0110}; -"7": FNBuild_param64_hexdigit = {param64[59:0],4'b0111}; -"8": FNBuild_param64_hexdigit = {param64[59:0],4'b1000}; -"9": FNBuild_param64_hexdigit = {param64[59:0],4'b1001}; -"A": FNBuild_param64_hexdigit = {param64[59:0],4'b1010}; -"B": FNBuild_param64_hexdigit = {param64[59:0],4'b1011}; -"C": FNBuild_param64_hexdigit = {param64[59:0],4'b1100}; -"D": FNBuild_param64_hexdigit = {param64[59:0],4'b1101}; -"E": FNBuild_param64_hexdigit = {param64[59:0],4'b1110}; -"F": FNBuild_param64_hexdigit = {param64[59:0],4'b1111}; -"a": FNBuild_param64_hexdigit = {param64[59:0],4'b1010}; -"b": FNBuild_param64_hexdigit = {param64[59:0],4'b1011}; -"c": FNBuild_param64_hexdigit = {param64[59:0],4'b1100}; -"d": FNBuild_param64_hexdigit = {param64[59:0],4'b1101}; -"e": FNBuild_param64_hexdigit = {param64[59:0],4'b1110}; -"f": FNBuild_param64_hexdigit = {param64[59:0],4'b1111}; -default: FNBuild_param64_hexdigit = param64; // EOL etc returns param64 unchanged + +function [2:0] FNsize_inc; +// top 2 bits encode 01 (byte), 10 (halfword), 11 (word) 00 - no parameter +input [2:0] cnt8; +case (cnt8[2:0]) +3'b000: FNsize_inc = 3'b010; +3'b010: FNsize_inc = 3'b011; +3'b011: FNsize_inc = 3'b100; +3'b100: FNsize_inc = 3'b101; +default: + FNsize_inc = 3'b111; endcase endfunction -function [63:0] FNBuild_param64_byte; -input [63:0] param64; -input [7:0] octet; - FNBuild_param64_byte = {octet[7:0], param64[63:08]}; +function [1:0] FNparam2size; +// top 2 bits encode 01 (byte), 10 (halfword), 11 (word) 00 - no parameter +input [1:0] parm2; +case (parm2[1:0]) +2'b01: FNparam2size = 2'b00; // 8-bit +2'b10: FNparam2size = 2'b01; // 16-bit +2'b11: FNparam2size = 2'b10; // 32-bit +default: + FNparam2size = 2'b10;// default to 32-bit +endcase endfunction -function [31:0] FNBuild_param32_hexdigit; -input [31:0] param32; +function [34:0] FNBuild_size3_param32_hexdigit; +input [34:0] param32; input [7:0] char8; case (char8[7:0]) -"\t":FNBuild_param32_hexdigit = 32'b0; // tab starts new (zeroed) param32 -" ": FNBuild_param32_hexdigit = 32'b0; // space starts new (zeroed) param32 -"x": FNBuild_param32_hexdigit = 32'b0; // hex prefix starts new (zeroed) param32 -"X": FNBuild_param32_hexdigit = 32'b0; // hex prefix starts new (zeroed) param32 -"0": FNBuild_param32_hexdigit = {param32[27:0],4'b0000}; -"1": FNBuild_param32_hexdigit = {param32[27:0],4'b0001}; -"2": FNBuild_param32_hexdigit = {param32[27:0],4'b0010}; -"3": FNBuild_param32_hexdigit = {param32[27:0],4'b0011}; -"4": FNBuild_param32_hexdigit = {param32[27:0],4'b0100}; -"5": FNBuild_param32_hexdigit = {param32[27:0],4'b0101}; -"6": FNBuild_param32_hexdigit = {param32[27:0],4'b0110}; -"7": FNBuild_param32_hexdigit = {param32[27:0],4'b0111}; -"8": FNBuild_param32_hexdigit = {param32[27:0],4'b1000}; -"9": FNBuild_param32_hexdigit = {param32[27:0],4'b1001}; -"A": FNBuild_param32_hexdigit = {param32[27:0],4'b1010}; -"B": FNBuild_param32_hexdigit = {param32[27:0],4'b1011}; -"C": FNBuild_param32_hexdigit = {param32[27:0],4'b1100}; -"D": FNBuild_param32_hexdigit = {param32[27:0],4'b1101}; -"E": FNBuild_param32_hexdigit = {param32[27:0],4'b1110}; -"F": FNBuild_param32_hexdigit = {param32[27:0],4'b1111}; -"a": FNBuild_param32_hexdigit = {param32[27:0],4'b1010}; -"b": FNBuild_param32_hexdigit = {param32[27:0],4'b1011}; -"c": FNBuild_param32_hexdigit = {param32[27:0],4'b1100}; -"d": FNBuild_param32_hexdigit = {param32[27:0],4'b1101}; -"e": FNBuild_param32_hexdigit = {param32[27:0],4'b1110}; -"f": FNBuild_param32_hexdigit = {param32[27:0],4'b1111}; -default: FNBuild_param32_hexdigit = param32; // EOL etc returns param32 unchanged +"\t":FNBuild_size3_param32_hexdigit = 35'b0; // tab starts new (zeroed) param32 +" ": FNBuild_size3_param32_hexdigit = 35'b0; // space starts new (zeroed) param32 +"x": FNBuild_size3_param32_hexdigit = 35'b0; // hex prefix starts new (zeroed) param32 +"X": FNBuild_size3_param32_hexdigit = 35'b0; // hex prefix starts new (zeroed) param32 +"0": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b0000}; +"1": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b0001}; +"2": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b0010}; +"3": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b0011}; +"4": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b0100}; +"5": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b0101}; +"6": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b0110}; +"7": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b0111}; +"8": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1000}; +"9": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1001}; +"A": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1010}; +"B": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1011}; +"C": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1100}; +"D": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1101}; +"E": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1110}; +"F": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1111}; +"a": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1010}; +"b": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1011}; +"c": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1100}; +"d": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1101}; +"e": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1110}; +"f": FNBuild_size3_param32_hexdigit = {FNsize_inc(param32[34:32]),param32[27:0],4'b1111}; +default: FNBuild_size3_param32_hexdigit = param32; // EOL etc returns param32 unchanged endcase endfunction -function [31:0] FNBuild_param32_byte; -input [31:0] param32; -input [7:0] octet; - FNBuild_param32_byte = {octet[7:0], param32[31:08]}; -endfunction - - function [7:0] FNmap_hex_digit; input [3:0] nibble; @@ -250,7 +226,6 @@ default: FNmap_hex_digit = "0"; endcase endfunction - // as per Vivado synthesis mapping `ifdef ADPFSMDESIGN localparam ADP_WRITEHEX = 6'b000000 ; @@ -288,71 +263,65 @@ localparam STD_RXD2 = 6'b011111 ; localparam STD_TXD1 = 6'b100000 ; localparam STD_TXD2 = 6'b100001 ; localparam ADP_UCTRL = 6'b100010 ; -localparam ADP_UREADB0 = 6'b100011 ; -localparam ADP_UREADB1 = 6'b100100 ; -localparam ADP_UREADB2 = 6'b100101 ; -localparam ADP_UREADB3 = 6'b100110 ; -localparam ADP_UWRITE = 6'b100111 ; -localparam ADP_POLL = 6'b101000 ; -localparam ADP_POLL1 = 6'b101001 ; -localparam ADP_POLL2 = 6'b101010 ; -localparam ADP_FCTRL = 6'b101011 ; -localparam ADP_FWRITE = 6'b101100 ; -localparam ADP_ECHOCMD = 6'b101101 ; -localparam ADP_ECHOBUS = 6'b101110 ; -localparam ADP_UNKNOWN = 6'b101111 ; +localparam ADP_UREADB = 6'b100011 ; +localparam ADP_UWRITE = 6'b100100 ; +localparam ADP_POLL = 6'b100101 ; +localparam ADP_POLL1 = 6'b100110 ; +localparam ADP_POLL2 = 6'b100111 ; +localparam ADP_FCTRL = 6'b101000 ; +localparam ADP_FWRITE = 6'b101001 ; +localparam ADP_ECHOCMD = 6'b101010 ; +localparam ADP_ECHOBUS = 6'b101011 ; +localparam ADP_UNKNOWN = 6'b101100 ; reg [5:0] adp_state ; `else // one-hot encoded explicitly -localparam ADP_WRITEHEX = 48'b000000000000000000000000000000000000000000000001 ; // = 6'b000000 -localparam ADP_WRITEHEXS = 48'b000000000000000000000000000000000000000000000010 ; // = 6'b000001 -localparam ADP_WRITEHEX9 = 48'b000000000000000000000000000000000000000000000100 ; // = 6'b000010 -localparam ADP_WRITEHEX8 = 48'b000000000000000000000000000000000000000000001000 ; // = 6'b000011 -localparam ADP_WRITEHEX7 = 48'b000000000000000000000000000000000000000000010000 ; // = 6'b000100 -localparam ADP_WRITEHEX6 = 48'b000000000000000000000000000000000000000000100000 ; // = 6'b000101 -localparam ADP_WRITEHEX5 = 48'b000000000000000000000000000000000000000001000000 ; // = 6'b000110 -localparam ADP_WRITEHEX4 = 48'b000000000000000000000000000000000000000010000000 ; // = 6'b000111 -localparam ADP_WRITEHEX3 = 48'b000000000000000000000000000000000000000100000000 ; // = 6'b001000 -localparam ADP_WRITEHEX2 = 48'b000000000000000000000000000000000000001000000000 ; // = 6'b001001 -localparam ADP_WRITEHEX1 = 48'b000000000000000000000000000000000000010000000000 ; // = 6'b001010 -localparam ADP_WRITEHEX0 = 48'b000000000000000000000000000000000000100000000000 ; // = 6'b001011 -localparam ADP_LINEACK = 48'b000000000000000000000000000000000001000000000000 ; // = 6'b001100 -localparam ADP_LINEACK2 = 48'b000000000000000000000000000000000010000000000000 ; // = 6'b001101 -localparam ADP_PROMPT = 48'b000000000000000000000000000000000100000000000000 ; // = 6'b001110 -localparam ADP_IOCHK = 48'b000000000000000000000000000000001000000000000000 ; // = 6'b001111 -localparam ADP_STDOUT = 48'b000000000000000000000000000000010000000000000000 ; // = 6'b010000 -localparam ADP_STDOUT1 = 48'b000000000000000000000000000000100000000000000000 ; // = 6'b010001 -localparam ADP_STDOUT2 = 48'b000000000000000000000000000001000000000000000000 ; // = 6'b010010 -localparam ADP_STDOUT3 = 48'b000000000000000000000000000010000000000000000000 ; // = 6'b010011 -localparam ADP_RXCMD = 48'b000000000000000000000000000100000000000000000000 ; // = 6'b010100 -localparam ADP_RXPARAM = 48'b000000000000000000000000001000000000000000000000 ; // = 6'b010101 -localparam ADP_ACTION = 48'b000000000000000000000000010000000000000000000000 ; // = 6'b010110 -localparam ADP_SYSCTL = 48'b000000000000000000000000100000000000000000000000 ; // = 6'b010111 -localparam ADP_READ = 48'b000000000000000000000001000000000000000000000000 ; // = 6'b011000 -localparam ADP_SYSCHK = 48'b000000000000000000000010000000000000000000000000 ; // = 6'b011001 -localparam ADP_STDIN = 48'b000000000000000000000100000000000000000000000000 ; // = 6'b011010 -localparam ADP_WRITE = 48'b000000000000000000001000000000000000000000000000 ; // = 6'b011011 -localparam ADP_EXIT = 48'b000000000000000000010000000000000000000000000000 ; // = 6'b011100 -localparam STD_IOCHK = 48'b000000000000000000100000000000000000000000000000 ; // = 6'b011101 -localparam STD_RXD1 = 48'b000000000000000001000000000000000000000000000000 ; // = 6'b011110 -localparam STD_RXD2 = 48'b000000000000000010000000000000000000000000000000 ; // = 6'b011111 -localparam STD_TXD1 = 48'b000000000000000100000000000000000000000000000000 ; // = 6'b100000 -localparam STD_TXD2 = 48'b000000000000001000000000000000000000000000000000 ; // = 6'b100001 -localparam ADP_UCTRL = 48'b000000000000010000000000000000000000000000000000 ; // = 6'b100010 -localparam ADP_UREADB0 = 48'b000000000000100000000000000000000000000000000000 ; // = 6'b100011 -localparam ADP_UREADB1 = 48'b000000000001000000000000000000000000000000000000 ; // = 6'b100100 -localparam ADP_UREADB2 = 48'b000000000010000000000000000000000000000000000000 ; // = 6'b100101 -localparam ADP_UREADB3 = 48'b000000000100000000000000000000000000000000000000 ; // = 6'b100110 -localparam ADP_UWRITE = 48'b000000001000000000000000000000000000000000000000 ; // = 6'b100111 -localparam ADP_POLL = 48'b000000010000000000000000000000000000000000000000 ; // = 6'b101000 -localparam ADP_POLL1 = 48'b000000100000000000000000000000000000000000000000 ; // = 6'b101001 -localparam ADP_POLL2 = 48'b000001000000000000000000000000000000000000000000 ; // = 6'b101010 -localparam ADP_FCTRL = 48'b000010000000000000000000000000000000000000000000 ; // = 6'b101011 -localparam ADP_FWRITE = 48'b000100000000000000000000000000000000000000000000 ; // = 6'b101100 -localparam ADP_ECHOCMD = 48'b001000000000000000000000000000000000000000000000 ; // = 6'b101101 -localparam ADP_ECHOBUS = 48'b010000000000000000000000000000000000000000000000 ; // = 6'b101110 -localparam ADP_UNKNOWN = 48'b100000000000000000000000000000000000000000000000 ; // = 6'b101111 -reg [47:0] adp_state ; +localparam ADP_WRITEHEX = 45'b000000000000000000000000000000000000000000001 ; // = 6'b000000 ; +localparam ADP_WRITEHEXS = 45'b000000000000000000000000000000000000000000010 ; // = 6'b000001 ; +localparam ADP_WRITEHEX9 = 45'b000000000000000000000000000000000000000000100 ; // = 6'b000010 ; +localparam ADP_WRITEHEX8 = 45'b000000000000000000000000000000000000000001000 ; // = 6'b000011 ; +localparam ADP_WRITEHEX7 = 45'b000000000000000000000000000000000000000010000 ; // = 6'b000100 ; +localparam ADP_WRITEHEX6 = 45'b000000000000000000000000000000000000000100000 ; // = 6'b000101 ; +localparam ADP_WRITEHEX5 = 45'b000000000000000000000000000000000000001000000 ; // = 6'b000110 ; +localparam ADP_WRITEHEX4 = 45'b000000000000000000000000000000000000010000000 ; // = 6'b000111 ; +localparam ADP_WRITEHEX3 = 45'b000000000000000000000000000000000000100000000 ; // = 6'b001000 ; +localparam ADP_WRITEHEX2 = 45'b000000000000000000000000000000000001000000000 ; // = 6'b001001 ; +localparam ADP_WRITEHEX1 = 45'b000000000000000000000000000000000010000000000 ; // = 6'b001010 ; +localparam ADP_WRITEHEX0 = 45'b000000000000000000000000000000000100000000000 ; // = 6'b001011 ; +localparam ADP_LINEACK = 45'b000000000000000000000000000000001000000000000 ; // = 6'b001100 ; +localparam ADP_LINEACK2 = 45'b000000000000000000000000000000010000000000000 ; // = 6'b001101 ; +localparam ADP_PROMPT = 45'b000000000000000000000000000000100000000000000 ; // = 6'b001110 ; +localparam ADP_IOCHK = 45'b000000000000000000000000000001000000000000000 ; // = 6'b001111 ; +localparam ADP_STDOUT = 45'b000000000000000000000000000010000000000000000 ; // = 6'b010000 ; +localparam ADP_STDOUT1 = 45'b000000000000000000000000000100000000000000000 ; // = 6'b010001 ; +localparam ADP_STDOUT2 = 45'b000000000000000000000000001000000000000000000 ; // = 6'b010010 ; +localparam ADP_STDOUT3 = 45'b000000000000000000000000010000000000000000000 ; // = 6'b010011 ; +localparam ADP_RXCMD = 45'b000000000000000000000000100000000000000000000 ; // = 6'b010100 ; +localparam ADP_RXPARAM = 45'b000000000000000000000001000000000000000000000 ; // = 6'b010101 ; +localparam ADP_ACTION = 45'b000000000000000000000010000000000000000000000 ; // = 6'b010110 ; +localparam ADP_SYSCTL = 45'b000000000000000000000100000000000000000000000 ; // = 6'b010111 ; +localparam ADP_READ = 45'b000000000000000000001000000000000000000000000 ; // = 6'b011000 ; +localparam ADP_SYSCHK = 45'b000000000000000000010000000000000000000000000 ; // = 6'b011001 ; +localparam ADP_STDIN = 45'b000000000000000000100000000000000000000000000 ; // = 6'b011010 ; +localparam ADP_WRITE = 45'b000000000000000001000000000000000000000000000 ; // = 6'b011011 ; +localparam ADP_EXIT = 45'b000000000000000010000000000000000000000000000 ; // = 6'b011100 ; +localparam STD_IOCHK = 45'b000000000000000100000000000000000000000000000 ; // = 6'b011101 ; +localparam STD_RXD1 = 45'b000000000000001000000000000000000000000000000 ; // = 6'b011110 ; +localparam STD_RXD2 = 45'b000000000000010000000000000000000000000000000 ; // = 6'b011111 ; +localparam STD_TXD1 = 45'b000000000000100000000000000000000000000000000 ; // = 6'b100000 ; +localparam STD_TXD2 = 45'b000000000001000000000000000000000000000000000 ; // = 6'b100001 ; +localparam ADP_UCTRL = 45'b000000000010000000000000000000000000000000000 ; // = 6'b100010 ; +localparam ADP_UREADB = 45'b000000000100000000000000000000000000000000000 ; // = 6'b100011 ; +localparam ADP_UWRITE = 45'b000000001000000000000000000000000000000000000 ; // = 6'b100100 ; +localparam ADP_POLL = 45'b000000010000000000000000000000000000000000000 ; // = 6'b100101 ; +localparam ADP_POLL1 = 45'b000000100000000000000000000000000000000000000 ; // = 6'b100110 ; +localparam ADP_POLL2 = 45'b000001000000000000000000000000000000000000000 ; // = 6'b100111 ; +localparam ADP_FCTRL = 45'b000010000000000000000000000000000000000000000 ; // = 6'b101000 ; +localparam ADP_FWRITE = 45'b000100000000000000000000000000000000000000000 ; // = 6'b101001 ; +localparam ADP_ECHOCMD = 45'b001000000000000000000000000000000000000000000 ; // = 6'b101010 ; +localparam ADP_ECHOBUS = 45'b010000000000000000000000000000000000000000000 ; // = 6'b101011 ; +localparam ADP_UNKNOWN = 45'b100000000000000000000000000000000000000000000 ; // = 6'b101100 ; +reg [44:0] adp_state ; `endif reg [31:0] adp_bus_data; @@ -367,8 +336,10 @@ reg adp_bus_req ; reg adp_bus_write ; reg adp_bus_err ; reg [7:0] adp_cmd ; -reg [32:0] adp_param ; +reg [7:0] adp_cmdwid ; +reg [34:0] adp_param ; reg [31:0] adp_addr ; +reg [1:0] adp_size ; reg adp_addr_inc; reg [31:0] adp_sys ; @@ -402,18 +373,25 @@ always @(posedge HCLK or negedge HRESETn) else if (HREADY_i) ahb_dphase <= (ahb_aphase); -assign HADDR32_o = adp_addr; +wire [1:0] byteaddr; + +assign byteaddr = (adp_size[1]) ? 2'b00 : (adp_size[0]) ? {adp_addr[1], 1'b0} : adp_addr[1:0]; + +assign HADDR32_o[31:2] = adp_addr[31:2]; +assign HADDR32_o[ 1:0] = byteaddr[1:0]; assign HBURST3_o = 3'b001; // "INCR" burst signalled whenever transfer; assign HMASTLOCK_o = 1'b0; assign HPROT4_o[3:0] = {1'b0, 1'b0, 1'b1, 1'b1}; -assign HSIZE3_o[2:0] = {1'b0, 2'b10}; +assign HSIZE3_o[2:0] = {1'b0, adp_size}; assign HTRANS2_o = {ahb_aphase,1'b0}; // non-seq -assign HWDATA32_o = adp_bus_data; +assign HWDATA32_o = (adp_size[1]) ? adp_bus_data + : (adp_size[0]) ? {2{adp_bus_data[15:0]}} + : {4{adp_bus_data[7:0]}} ; assign HWRITE_o = adp_bus_write; `ifndef ADPBASIC -reg [31:0] adp_val; +reg [34:0] adp_val; reg [31:0] adp_mask; reg [31:0] adp_poll; reg [31:0] adp_count; @@ -477,6 +455,7 @@ always @(posedge HCLK or negedge HRESETn) adp_bus_err <= 0; // default no bus error adp_cmd <= 0; adp_param <= 0; + adp_size <= 2'b10; // default to 32-bit word size adp_addr <= 0; adp_addr_inc <= 0; adp_bus_write<= 0; @@ -494,7 +473,7 @@ always @(posedge HCLK or negedge HRESETn) std_tx_req <= 0; // default no TX req std_rx_ack <= 0; // default no RX ack adp_bus_req <= 0; // default no bus transaction - adp_addr <= (adp_addr_inc & adp_bus_done) ? adp_addr + 4 : adp_addr; // address++ + adp_addr <= (adp_addr_inc & adp_bus_done) ? adp_addr + (1 << adp_size) : adp_addr; // address++ adp_addr_inc <= 0; `ifndef ADPBASIC adp_count <= (adp_count_dec & adp_bus_done & |adp_count) ? adp_count - 1 : adp_count; // param-- @@ -553,8 +532,8 @@ always @(posedge HCLK or negedge HRESETn) if (com_rx_done) begin if (FNexit(com_rx_byte)) adp_state <= STD_IOCHK; // immediate exit else if (FNvalid_space(com_rx_byte)) com_rx_ack <= 1; // retry for a command - else if (FNvalid_EOL(com_rx_byte)) begin adp_cmd <= "?"; adp_state <= ADP_ACTION; end // no command, skip param - else begin adp_cmd <= com_rx_byte; adp_param <= 33'h1_00000000; com_rx_ack <= 1; adp_state <= ADP_RXPARAM; end // get optional parameter + else if (FNvalid_EOL(com_rx_byte)) begin adp_cmd <= "?"; adp_state <= ADP_LINEACK; end // no command, skip param + else begin adp_cmd <= com_rx_byte; adp_param <= 35'h0_00000000; com_rx_ack <= 1; adp_state <= ADP_RXPARAM; end // get optional parameter end else com_rx_ack <= 1; // extend stream request if not ready ADP_RXPARAM: // read and build hex parameter @@ -562,12 +541,14 @@ always @(posedge HCLK or negedge HRESETn) if (FNexit(com_rx_byte)) adp_state <= STD_IOCHK; // exit else if (FNvalid_EOL(com_rx_byte)) `ifndef ADPBASIC - begin adp_count <= adp_param[31:0]; adp_state <= ADP_ACTION; end // parameter complete on EOL + begin adp_count <= adp_param[31:0]; adp_state <= ADP_ACTION; + adp_size <= FNparam2size(adp_param[34:33]); end // parameter complete on EOL `else - begin adp_state <= ADP_ACTION; end // parameter complete on EOL + begin adp_state <= ADP_ACTION; + adp_size <= FNparam2size(adp_param[34:33]); end // parameter complete on EOL `endif else - begin adp_param <= {1'b0,FNBuild_param32_hexdigit(adp_param[31:0], com_rx_byte)}; com_rx_ack <= 1; end // build parameter + begin adp_param <= FNBuild_size3_param32_hexdigit(adp_param[34:0], com_rx_byte); com_rx_ack <= 1; end // build parameter end else com_rx_ack <= 1; @@ -575,10 +556,10 @@ always @(posedge HCLK or negedge HRESETn) if (FNexit(com_rx_byte)) adp_state <= STD_IOCHK; else if (FNvalid_cmd(adp_cmd) == CMD_A) - begin if (adp_param[32] == 1'b1) adp_param <= {1'b0, adp_addr}; else adp_addr <= adp_param[31:0]; + begin if (|adp_param[34:32]) adp_addr <= adp_param[31:0]; else adp_param <= {3'b111, adp_addr} ; adp_state <= ADP_ECHOCMD; end else if (FNvalid_cmd(adp_cmd) == CMD_C) begin - if (adp_param[32]) // report GPO + if (|adp_param[34:32] == 1'b0) // report GPO begin adp_state <= ADP_SYSCTL; end else if (adp_param[31:8] == 1) // clear selected bits in GPO begin adp_sys[7:0] <= adp_sys[7:0] & ~adp_param[7:0]; adp_state <= ADP_SYSCTL; end @@ -590,7 +571,7 @@ always @(posedge HCLK or negedge HRESETn) begin adp_state <= ADP_SYSCTL; end end else if (FNvalid_cmd(adp_cmd) == CMD_R) - begin ADP_BUSREADINC_next; adp_state <= ADP_READ; + begin adp_size <= FNparam2size(adp_param[34:33]); ADP_BUSREADINC_next; adp_state <= ADP_READ; `ifndef ADPBASIC adp_count_dec <= 1'b1; // optional loop param `endif @@ -598,19 +579,20 @@ always @(posedge HCLK or negedge HRESETn) else if (FNvalid_cmd(adp_cmd) == CMD_S) begin adp_state <= ADP_SYSCHK; end else if (FNvalid_cmd(adp_cmd) == CMD_W) - begin adp_bus_data <= adp_param[31:0]; ADP_BUSWRITEINC_next; adp_state <= ADP_WRITE; end + begin adp_size <= FNparam2size(adp_param[34:33]); adp_bus_data <= adp_param[31:0]; ADP_BUSWRITEINC_next; adp_state <= ADP_WRITE; end else if (FNvalid_cmd(adp_cmd) == CMD_X) begin com_tx_byte <= 8'h0a; com_tx_req <= 1; adp_state <= ADP_EXIT; end `ifndef ADPBASIC else if (FNvalid_cmd(adp_cmd) == CMD_U) if (FNcount_down_zero_next(adp_param[31:0])) adp_state <= ADP_ECHOCMD; else adp_state <= ADP_UCTRL; // non-zero count else if (FNvalid_cmd(adp_cmd) == CMD_M) - begin if (adp_param[32] == 1'b1) adp_param <= {1'b0,adp_mask}; else adp_mask <= adp_param[31:0]; + begin if (|adp_param[34:32]) adp_mask <= adp_param[31:0]; else adp_param <= {3'b111,adp_mask}; adp_state <= ADP_ECHOCMD; end else if (FNvalid_cmd(adp_cmd) == CMD_P) if (FNcount_down_zero_next(adp_param[31:0])) adp_state <= ADP_ECHOCMD; else adp_state <= ADP_POLL; // non-zero count else if (FNvalid_cmd(adp_cmd) == CMD_V) - begin if (adp_param[32] == 1'b1) adp_param <= {1'b0,adp_val}; else adp_val <= adp_param[31:0]; + begin if (|adp_param[34:32]) begin adp_size <= FNparam2size(adp_param[34:33]); adp_val <= adp_param[34:0]; end + else adp_param <= adp_val; adp_state <= ADP_ECHOCMD; end else if (FNvalid_cmd(adp_cmd) == CMD_F) if (FNcount_down_zero_next(adp_param[31:0])) adp_state <= ADP_ECHOCMD; else adp_state <= ADP_FCTRL; // non-zero count @@ -625,9 +607,14 @@ always @(posedge HCLK or negedge HRESETn) else begin ADP_BUSWRITEINC_next; end // extend request ADP_READ: // perform bus read at current adp address (and auto increment) - and report in hex - if (adp_bus_done) begin adp_bus_data <= HRDATA32_i; adp_bus_err <= HRESP_i; ADP_txchar_next("R"); adp_state <= ADP_ECHOBUS; end + if (adp_bus_done) begin adp_bus_data <= (byteaddr[1:0] == 2'b01) ? {HRDATA32_i[ 7: 0],HRDATA32_i[31: 8]} + : (byteaddr[1:0] == 2'b10) ? {HRDATA32_i[15: 0],HRDATA32_i[31:16]} + : (byteaddr[1:0] == 2'b11) ? {HRDATA32_i[23: 0],HRDATA32_i[31:24]} + : HRDATA32_i; + adp_bus_err <= HRESP_i; ADP_txchar_next("R"); adp_state <= ADP_ECHOBUS; + end else begin - ADP_BUSREADINC_next; + ADP_BUSREADINC_next; `ifndef ADPBASIC adp_count_dec<= 1'b1; `endif @@ -637,23 +624,14 @@ always @(posedge HCLK or negedge HRESETn) // >>>>>>>>>>>>>>>> ADP BINARY UPLOAD >>>>>>>>>>>>>>>>>>>>>> ADP_UCTRL: // set control value - begin com_rx_ack <= 1; adp_state <= ADP_UREADB0; end // read next 4 bytes - ADP_UREADB0: // read raw binary byte 0 - if (com_rx_done) begin com_rx_ack <= 1; adp_bus_data[ 7: 0] <= com_rx_byte; adp_state <= ADP_UREADB1; end - else com_rx_ack <= 1; // extend stream request if not ready - ADP_UREADB1: // read raw binary byte 1 - if (com_rx_done) begin com_rx_ack <= 1; adp_bus_data[15: 8] <= com_rx_byte; adp_state <= ADP_UREADB2; end - else com_rx_ack <= 1; // extend stream request if not ready - ADP_UREADB2: // read raw binary byte 2 - if (com_rx_done) begin com_rx_ack <= 1; adp_bus_data[23:16] <= com_rx_byte; adp_state <= ADP_UREADB3; end - else com_rx_ack <= 1; // extend stream request if not ready - ADP_UREADB3: // read raw binary byte 3 + begin com_rx_ack <= 1; adp_size = 2'b00; adp_state <= ADP_UREADB; end // read next byte + ADP_UREADB: // read raw binary byte if (com_rx_done) - begin adp_bus_data[31:24] <= com_rx_byte; ADP_BUSWRITEINC_next; adp_count_dec <= 1; adp_state <= ADP_UWRITE; end + begin adp_bus_data[31:0] <= {4{com_rx_byte}}; ADP_BUSWRITEINC_next; adp_count_dec <= 1; adp_state <= ADP_UWRITE; end else com_rx_ack <= 1; // extend stream request if not ready ADP_UWRITE: // Write word to Addr++ if (adp_bus_done) begin // auto address++, count-- - if (FNcount_down_zero_next(adp_count)) adp_state <= ADP_ECHOCMD; else begin adp_state <= ADP_UREADB0; adp_bus_err <= adp_bus_err | HRESP_i; end + if (FNcount_down_zero_next(adp_count)) adp_state <= ADP_ECHOCMD; else begin adp_state <= ADP_UREADB; adp_bus_err <= adp_bus_err | HRESP_i; end end else begin ADP_BUSWRITEINC_next; adp_count_dec <= 1; end // extend request // >>>>>>>>>>>>>>>> ADP BUS READ LOOP >>>>>>>>>>>>>>>>>>>>>> @@ -664,12 +642,12 @@ always @(posedge HCLK or negedge HRESETn) else begin adp_bus_req <= 1; adp_count_dec <=1; end ADP_POLL2: if (FNcount_down_zero_next(adp_count)) begin adp_state <= ADP_ECHOCMD; adp_bus_err <= 1'b1; end // timeout - else if (((adp_bus_data & adp_mask) ^ adp_val) == 0) begin adp_state <= ADP_ECHOCMD; adp_param <= {1'b0, (adp_param[31:0] - adp_count)}; end // exact match + else if (((adp_bus_data & adp_mask) ^ adp_val[31:0]) == 0) begin adp_state <= ADP_ECHOCMD; adp_param <= {1'b0, (adp_param[31:0] - adp_count)}; end // exact match else adp_state <= ADP_POLL; // >>>>>>>>>>>>>>>> ADP (ZERO) FILL MEMORY >>>>>>>>>>>>>>>>>>>>>> ADP_FCTRL: // set control value - begin adp_bus_data <= adp_val; ADP_BUSWRITEINC_next; adp_count_dec <= 1; adp_state <= ADP_FWRITE; end + begin adp_size <= FNparam2size(adp_val[34:33]); adp_bus_data <= adp_val[31:0]; ADP_BUSWRITEINC_next; adp_count_dec <= 1; adp_state <= ADP_FWRITE; end ADP_FWRITE: // Write word to Addr++ if (adp_bus_done) begin // auto address++, count-- if (FNcount_down_zero_next(adp_count)) adp_state <= ADP_ECHOCMD; else begin adp_state <= ADP_FCTRL; adp_bus_err <= adp_bus_err | HRESP_i; end @@ -711,7 +689,9 @@ always @(posedge HCLK or negedge HRESETn) if (com_tx_done) begin adp_state <= ADP_WRITEHEX9; ADP_txchar_next("0"); end // output "0" hex prefix else com_tx_req <= 1; // extend ADP_WRITEHEX9: - if (com_tx_done) begin adp_state <= ADP_WRITEHEX8; ADP_txchar_next("x"); end // output "x" hex prefix + if (com_tx_done & adp_size[1]) begin adp_state <= ADP_WRITEHEX8; ADP_txchar_next("x"); end // output "x" hex prefix + else if (com_tx_done & adp_size[0]) begin adp_state <= ADP_WRITEHEX4; ADP_txchar_next("x"); end // output "x" hex prefix + else if (com_tx_done) begin adp_state <= ADP_WRITEHEX2; ADP_txchar_next("x"); end // output "x" hex prefix else com_tx_req <= 1; // extend ADP_WRITEHEX8: if (com_tx_done) begin adp_state <= ADP_WRITEHEX7; ADP_hexdigit_next(adp_bus_data[31:28]); end // hex nibble 7 @@ -764,12 +744,10 @@ always @(posedge HCLK or negedge HRESETn) endmodule -//`end_keywords - ////AHBLITE_ADPMASTER instancing -//ADPmaster +//adp_manager // #(.PROMPT_CHAR ("]")) -// ADPmaster( +// ADPmanager( // .HCLK (ahb_hclk ), // .HRESETn (ahb_hrestn ), // .HADDR32_o (ahb_haddr ), @@ -783,7 +761,8 @@ endmodule // .HRDATA32_i (ahb_hrdata ), // .HREADY_i (ahb_hready ), // .HRESP_i (ahb_hresp ), - +// .GPO8_o (gpio8 ), +// .GPI8_i (gpio8 ), // .COMRX_TREADY_o(com_rx_tready), // .COMRX_TDATA_i(com_rx_tdata), // .COMRX_TVALID_i(com_rx_tvalid), @@ -796,5 +775,4 @@ endmodule // .STDTX_TVALID_o(std_tx_tvalid), // .STDTX_TDATA_o(std_tx_tdata), // .STDTX_TREADY_i(std_tx_tready) - // ); diff --git a/system/testcodes/adp_demo/adp.cmd b/system/testcodes/adp_demo/adp.cmd index 62cc629f881d2622f1c1447bbd411c6ad3f1d53d..89934e9acde45e350ffdfebc5917cc2e8f229333 100644 --- a/system/testcodes/adp_demo/adp.cmd +++ b/system/testcodes/adp_demo/adp.cmd @@ -21,12 +21,40 @@ r r A +a 0x80000000 +a +w 0xb0 +a +w 0xb1 +a +w 0xb3b2 +a +w 0xb7b6b5b4 +a +a 0x80000000 +a +r 0x8 +a +a 0x80000000 +a +r 0x004 +a +a 0x80000000 +a +r 0x000002 +a +a 0x80000000 +a +r +r +a + v 0xe5e5e5e5 a 80000000 f 4000 A a 90000000 -U 4 +U 0x0f 0123456789ABCDE A A 0x90000000