URL
https://opencores.org/ocsvn/hive/hive/trunk
Subversion Repositories hive
Compare Revisions
- This comparison shows the changes necessary to convert path
/hive
- from Rev 3 to Rev 4
- ↔ Reverse comparison
Rev 3 → Rev 4
/trunk/v04.05/op_encode.h
0,0 → 1,77
`include "lg_sel_encode.h" |
`include "tst_encode.h" |
|
// `ifndef _op_encode_h_ |
// `define _op_encode_h_ |
|
// misc - 16 x 16 x 16 = 4096 codes |
localparam [MEM_DATA_W-1:0] op_nop = { 4'h0, 4'h0, 4'hx, 4'hx }; // do nothing (no pops either) |
localparam [MEM_DATA_W-1:0] op_pop = { 4'h0, 4'h1, 4'hx, 4'hx }; // pop [7:0] none/one/some/all stacks |
localparam [MEM_DATA_W-1:0] op_pgc = { 4'h0, 4'h4, 4'hx, 4'hx }; // A=PC read PC (unsigned) |
localparam [MEM_DATA_W-1:0] op_lit_s = { 4'h0, 4'h8, 4'hx, 4'hx }; // A=mem(PC) literal data signed |
localparam [MEM_DATA_W-1:0] op_lit_h = { 4'h0, 4'h9, 4'hx, 4'hx }; // A={mem(PC),A[lo]} literal data high |
localparam [MEM_DATA_W-1:0] op_lit_u = { 4'h0, 4'ha, 4'hx, 4'hx }; // A=mem(PC) literal data unsigned |
localparam [MEM_DATA_W-1:0] op_reg_rs = { 4'h0, 4'hc, 4'hx, 4'hx }; // A=reg(B) register read signed |
localparam [MEM_DATA_W-1:0] op_reg_rh = { 4'h0, 4'hd, 4'hx, 4'hx }; // A={reg(B),A[lo]} register read high |
localparam [MEM_DATA_W-1:0] op_reg_w = { 4'h0, 4'he, 4'hx, 4'hx }; // reg(B)=A[lo] register write |
localparam [MEM_DATA_W-1:0] op_reg_wh = { 4'h0, 4'hf, 4'hx, 4'hx }; // reg(B)=A[hi] register write high |
// logical & other - 16 x 16 x 16 = 4096 codes |
localparam [MEM_DATA_W-1:0] op_cpy = { 4'h1, `lg_cpy, 4'hx, 4'hx }; // A=B copy |
localparam [MEM_DATA_W-1:0] op_nsg = { 4'h1, `lg_nsg, 4'hx, 4'hx }; // A[MSB]=~B[MSB] invert sign |
localparam [MEM_DATA_W-1:0] op_not = { 4'h1, `lg_not, 4'hx, 4'hx }; // A=~B logical NOT |
localparam [MEM_DATA_W-1:0] op_flp = { 4'h1, `lg_flp, 4'hx, 4'hx }; // A=flip(B) flip bits end for end |
localparam [MEM_DATA_W-1:0] op_lzc = { 4'h1, `lg_lzc, 4'hx, 4'hx }; // A=lzc(B) leading zero count |
localparam [MEM_DATA_W-1:0] op_bra = { 4'h1, `lg_bra, 4'hx, 4'hx }; // A=&B logical AND bit reduction |
localparam [MEM_DATA_W-1:0] op_bro = { 4'h1, `lg_bro, 4'hx, 4'hx }; // A=|B logical OR bit reduction |
localparam [MEM_DATA_W-1:0] op_brx = { 4'h1, `lg_brx, 4'hx, 4'hx }; // A=^B logical XOR bit reduction |
localparam [MEM_DATA_W-1:0] op_and = { 4'h1, `lg_and, 4'hx, 4'hx }; // A=A&B logical AND |
localparam [MEM_DATA_W-1:0] op_orr = { 4'h1, `lg_orr, 4'hx, 4'hx }; // A=A|B logical OR |
localparam [MEM_DATA_W-1:0] op_xor = { 4'h1, `lg_xor, 4'hx, 4'hx }; // A=A^B logical XOR |
// arithmetic - 16 x 16 x 16 = 4096 codes |
localparam [MEM_DATA_W-1:0] op_add = { 4'h2, 4'h0, 4'hx, 4'hx }; // A=A+B add |
localparam [MEM_DATA_W-1:0] op_add_xs = { 4'h2, 4'h2, 4'hx, 4'hx }; // A=A+B add extended signed |
localparam [MEM_DATA_W-1:0] op_add_xu = { 4'h2, 4'h3, 4'hx, 4'hx }; // A=A+B add extended unsigned |
localparam [MEM_DATA_W-1:0] op_sub = { 4'h2, 4'h4, 4'hx, 4'hx }; // A=A-B subtract |
localparam [MEM_DATA_W-1:0] op_sub_xs = { 4'h2, 4'h6, 4'hx, 4'hx }; // A=A-B subtract extended signed |
localparam [MEM_DATA_W-1:0] op_sub_xu = { 4'h2, 4'h7, 4'hx, 4'hx }; // A=A-B subtract extended unsigned |
localparam [MEM_DATA_W-1:0] op_mul = { 4'h2, 4'h8, 4'hx, 4'hx }; // A=A*B multiply |
localparam [MEM_DATA_W-1:0] op_mul_xs = { 4'h2, 4'ha, 4'hx, 4'hx }; // A=A*B multiply extended signed |
localparam [MEM_DATA_W-1:0] op_mul_xu = { 4'h2, 4'hb, 4'hx, 4'hx }; // A=A*B multiply extended unsigned |
localparam [MEM_DATA_W-1:0] op_shl_s = { 4'h2, 4'hc, 4'hx, 4'hx }; // A=A<<<B shift left A signed |
localparam [MEM_DATA_W-1:0] op_shl_u = { 4'h2, 4'hd, 4'hx, 4'hx }; // A=A<<B shift left A unsigned |
localparam [MEM_DATA_W-1:0] op_pow = { 4'h2, 4'he, 4'hx, 4'hx }; // A=1<<B power of 2 |
// branching - 16 x 16 x 16 = 4096 codes |
localparam [MEM_DATA_W-1:0] op_jmp_z = { 4'h3, 2'b00, `z, 4'hx, 4'hx }; // PC=(A?0)?PC+B jump zero conditional |
localparam [MEM_DATA_W-1:0] op_jmp_nz = { 4'h3, 2'b00, `nz, 4'hx, 4'hx }; |
localparam [MEM_DATA_W-1:0] op_jmp_lz = { 4'h3, 2'b00, `lz, 4'hx, 4'hx }; |
localparam [MEM_DATA_W-1:0] op_jmp_nlz = { 4'h3, 2'b00, `nlz, 4'hx, 4'hx }; |
localparam [MEM_DATA_W-1:0] op_jmp = { 4'h3, 4'hc, 4'hx, 4'hx }; // PC=PC+B jump unconditional |
localparam [MEM_DATA_W-1:0] op_gto = { 4'h3, 4'hd, 4'hx, 4'hx }; // PC=B go to unconditional |
localparam [MEM_DATA_W-1:0] op_gsb = { 4'h3, 4'he, 4'hx, 4'hx }; // PC=B,A=PC subroutine call unconditional |
// immediate memory access - 4 x 16 x 16 x 16 = 16384 codes |
localparam [MEM_DATA_W-1:0] op_mem_irs = { 4'h4, 4'hx, 4'hx, 4'hx }; // A=mem(B+I) memory read signed |
localparam [MEM_DATA_W-1:0] op_mem_irh = { 4'h5, 4'hx, 4'hx, 4'hx }; // A={mem(B+I),A[lo]} memory read high |
localparam [MEM_DATA_W-1:0] op_mem_iw = { 4'h6, 4'hx, 4'hx, 4'hx }; // mem(B+I)=A[lo] memory write |
localparam [MEM_DATA_W-1:0] op_mem_iwh = { 4'h7, 4'hx, 4'hx, 4'hx }; // mem(B+I)=A[hi] memory write high |
// immediate conditional (A?B) jumps - 6 x 16 x 16 x 16 = 24576 codes |
localparam [MEM_DATA_W-1:0] op_jmp_ie = { `e, 4'hx, 4'hx, 4'hx }; // PC=(A?B)?PC+I jump immediate conditional |
localparam [MEM_DATA_W-1:0] op_jmp_ine = { `ne, 4'hx, 4'hx, 4'hx }; |
localparam [MEM_DATA_W-1:0] op_jmp_ils = { `ls, 4'hx, 4'hx, 4'hx }; |
localparam [MEM_DATA_W-1:0] op_jmp_inls = { `nls, 4'hx, 4'hx, 4'hx }; |
localparam [MEM_DATA_W-1:0] op_jmp_ilu = { `lu, 4'hx, 4'hx, 4'hx }; |
localparam [MEM_DATA_W-1:0] op_jmp_inlu = { `nlu, 4'hx, 4'hx, 4'hx }; |
// immediate conditional (A?0) jumps - 4 x 64 x 16 = 4096 codes |
localparam [MEM_DATA_W-1:0] op_jmp_iz = { 4'he, `z, 6'bxxxxxx, 4'hx }; // PC=(A?0)?PC+I jump immediate conditional |
localparam [MEM_DATA_W-1:0] op_jmp_inz = { 4'he, `nz, 6'bxxxxxx, 4'hx }; |
localparam [MEM_DATA_W-1:0] op_jmp_ilz = { 4'he, `lz, 6'bxxxxxx, 4'hx }; |
localparam [MEM_DATA_W-1:0] op_jmp_inlz = { 4'he, `nlz, 6'bxxxxxx, 4'hx }; |
// immediate data - 1 x 64 x 16 = 1024 codes |
localparam [MEM_DATA_W-1:0] op_dat_is = { 4'hf, 2'b00, 6'bxxxxxx, 4'hx }; // A=I data immediate signed |
// immediate add - 1 x 64 x 16 = 1024 codes |
localparam [MEM_DATA_W-1:0] op_add_is = { 4'hf, 2'b01, 6'bxxxxxx, 4'hx }; // A=A+I add immediate signed |
// immediate shifts - 2 x 64 x 16 = 2048 codes |
localparam [MEM_DATA_W-1:0] op_shl_is = { 4'hf, 2'b10, 6'bxxxxxx, 4'hx }; // A=A<<<I shift left A signed |
localparam [MEM_DATA_W-1:0] op_psu_i = { 4'hf, 2'b11, 6'bxxxxxx, 4'hx }; // A=1<<I power of 2; A=A<<I shift A unsigned |
|
// `endif // _op_encode_h_ |
|
/trunk/v04.05/alu_mult_shift.v
0,0 → 1,223
/* |
-------------------------------------------------------------------------------- |
|
Module : alu_mult_shift |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Multiply & shift unit for a processor ALU. |
|
Instantiates: |
- functions.h (clog2) |
- (1x) alu_multiply.v |
- (1x) pipe.v (debug mode only) |
- (4x) pipe.v |
|
Notes: |
- I/O optionally registered. |
- 5 stage pipeline w/ 4 mid registers (not counting I/O registering). |
- (pow=0 & shl=0) gives unsigned (sgn=0) and signed (sgn=1) A*B. |
- (pow=0 & shl=1) gives A unsigned (sgn=0) and A signed (sgn=1) A<<B. |
- (pow=1 & shl=0) gives 1<<B (sign=x). |
- (pow=1 & shl=1) and (B>=0) gives 1<<B, (B<0) gives A<<B (A signed & unsigned). |
- Debug mode for comparison to native signed multiplication, only use for |
simulation as it consumes resources and negatively impacts top speed. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module alu_mult_shift |
#( |
parameter integer REGS_IN = 1, // in register option |
parameter integer REGS_OUT = 1, // out register option |
parameter integer DATA_W = 32, // data width |
parameter integer DEBUG_MODE = 0 // 1=debug mode; 0=normal mode |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire sgn_i, // 1=signed |
input wire ext_i, // 1=extended result |
input wire shl_i, // 1=shift left |
input wire pow_i, // 1=power of 2 |
// data I/O |
input wire [DATA_W-1:0] a_i, // operand |
input wire [DATA_W-1:0] b_i, // operand |
output wire [DATA_W-1:0] result_o, // result |
// debug |
output wire debug_o // 1=bad match |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
`include "functions.h" // for clog2() |
localparam integer SH_SEL_W = clog2( DATA_W ); |
localparam integer ZSX_W = DATA_W+1; // +1 extra bit |
localparam integer DBL_W = DATA_W*2; // double width |
// |
wire [DATA_W-1:0] a, b; |
wire ext, pow, shl, sgn; |
wire b_neg; |
wire [DATA_W-1:0] b_pow; |
wire [ZSX_W-1:0] a_sex, b_sex; |
reg [ZSX_W-1:0] a_mux, b_mux; |
reg ext_mux; |
wire ext_mux_r; |
wire [DBL_W-1:0] res_dbl; |
reg [DATA_W-1:0] result; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// optional input data regs |
pipe |
#( |
.DEPTH ( REGS_IN ), |
.WIDTH ( DATA_W+DATA_W ), |
.RESET_VAL ( 0 ) |
) |
in_data_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { b_i, a_i } ), |
.data_o ( { b, a } ) |
); |
|
|
// optional input control regs |
pipe |
#( |
.DEPTH ( REGS_IN ), |
.WIDTH ( 4 ), |
.RESET_VAL ( 0 ) |
) |
in_ctrl_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { ext_i, pow_i, shl_i, sgn_i } ), |
.data_o ( { ext, pow, shl, sgn } ) |
); |
|
|
// some results pre-mux |
assign a_sex = { a[DATA_W-1], a }; |
assign b_sex = { b[DATA_W-1], b }; |
assign b_pow = 1'b1 << b[SH_SEL_W-1:0]; |
assign b_neg = b[DATA_W-1]; |
|
|
// mux inputs and extended result selector |
always @ ( * ) begin |
case ( { pow, shl, sgn } ) |
'b000 : begin // unsigned multiply |
a_mux <= a; |
b_mux <= b; |
ext_mux <= ext; |
end |
'b001 : begin // signed multiply |
a_mux <= a_sex; |
b_mux <= b_sex; |
ext_mux <= ext; |
end |
'b010 : begin // unsigned shift |
a_mux <= a; |
b_mux <= b_pow; |
ext_mux <= b_neg; |
end |
'b011 : begin // signed shift |
a_mux <= a_sex; |
b_mux <= b_pow; |
ext_mux <= b_neg; |
end |
'b100, 'b101 : begin // pow (sign is don't care) |
a_mux <= 1'b1; |
b_mux <= b_pow; |
ext_mux <= 1'b0; // modulo rather than zero for negative shift values |
end |
'b110 : begin // pow (0,+b) | unsigned shift (-b) |
a_mux <= ( b_neg ) ? a : 1'b1; |
b_mux <= b_pow; |
ext_mux <= b_neg; |
end |
'b111 : begin // pow (0,+b) | signed shift (-b) |
a_mux <= ( b_neg ) ? a_sex : 1'b1; |
b_mux <= b_pow; |
ext_mux <= b_neg; |
end |
endcase |
end |
|
|
// signed multiplier (4 registers deep) |
alu_multiply |
#( |
.DATA_W ( ZSX_W ), |
.DEBUG_MODE ( DEBUG_MODE ) |
) |
alu_multiply |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.a_i ( a_mux ), |
.b_i ( b_mux ), |
.result_o ( res_dbl ), |
.debug_o ( debug_o ) |
); |
|
|
// pipeline extended result selector to match multiply |
pipe |
#( |
.DEPTH ( 4 ), |
.WIDTH ( 1 ), |
.RESET_VAL ( 0 ) |
) |
regs_ext |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( ext_mux ), |
.data_o ( ext_mux_r ) |
); |
|
|
// multiplex |
always @ ( * ) begin |
case ( ext_mux_r ) |
'b1 : result <= res_dbl[DBL_W-1:DATA_W]; |
default : result <= res_dbl[DATA_W-1:0]; |
endcase |
end |
|
|
// optional output regs |
pipe |
#( |
.DEPTH ( REGS_OUT ), |
.WIDTH ( DATA_W ), |
.RESET_VAL ( 0 ) |
) |
out_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( result ), |
.data_o ( result_o ) |
); |
|
|
endmodule |
/trunk/v04.05/boot_code.h
0,0 → 1,172
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "boot_code_defs.h" |
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `__, `__ }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
// Thread 0 : do LED PWM action |
// All other threads : loop forever |
|
/////////////// |
// clr space // |
/////////////// |
|
// thread 0 |
i='h00; ram[i] = { `lit_u, `__, `s2 }; // s2=dat |
i=i+1; ram[i] = 16'h0100 ; // addr |
i=i+1; ram[i] = { `gto, `P2, `__ }; // goto, pop s2 (addr) |
// and the rest |
i='h04; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h08; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h0c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
//////////////// |
// intr space // |
//////////////// |
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
/* |
// simple binary count LED display |
i='h100; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
// loop start |
i=i+1; ram[i] = { `add_is, 6'd1, `P0 }; // s0++ |
i=i+1; ram[i] = { `psu_i, -6'd20, `s0 }; // s0=s0>>20 |
i=i+1; ram[i] = { `reg_w, `s1, `P0 }; // (s1)=s0, pop s0 |
i=i+1; ram[i] = { `jmp_ie, -4'd4, `s0, `s0 }; // loop forever |
// loop end |
*/ |
|
/* |
// simple sequential LED display |
i='h100; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
// loop start |
i=i+1; ram[i] = { `add_is, 6'd1, `P0 }; // s0++ |
i=i+1; ram[i] = { `shl_is, 6'd10, `s0 }; // s0=s0<<10 |
i=i+1; ram[i] = { `psu_i, -6'd30, `P0 }; // s0=s0>>30, pop s0 |
i=i+1; ram[i] = { `pow, `P0, `s0 }; // s0=1<<s0, pop s0 |
i=i+1; ram[i] = { `reg_w, `s1, `P0 }; // (s1)=s0, pop s0 |
i=i+1; ram[i] = { `jmp_ie, -4'd6, `s0, `s0 }; // loop forever |
// loop end |
*/ |
|
/* |
// sequential LED display w/ PWM - moving "dark spot" |
i='h100; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `dat_is, 6'd0, `s2 }; // s2=pwm |
// loop start |
i=i+1; ram[i] = { `shl_is, 6'd13, `s0 }; // s0=s0<<13 - isolate decimal |
i=i+1; ram[i] = { `add, `P0, `P2 }; // s2+=s0, pop s0 - add to pwm counter |
i=i+1; ram[i] = { `add_is, 6'd1, `P0 }; // s0++ - get next value |
i=i+1; ram[i] = { `shl_is, 6'd13, `s0 }; // s0=s0<<13 - isolate decimal |
i=i+1; ram[i] = { `add_xu, `P0, `s2 }; // s2=s2+s0, pop s0 - see if it will cause pwm counter overflow |
i=i+1; ram[i] = { `shl_is, 6'd19, `P2 }; // s2<<=19 - shift up to ones place |
i=i+1; ram[i] = { `add, `P2, `s0 }; // s0+=s2, pop s2 - add pwm bit |
i=i+1; ram[i] = { `shl_is, 6'd11, `P0 }; // s0<<=11 - isolate integer |
i=i+1; ram[i] = { `psu_i, -6'd30, `P0 }; // s0>>=30 |
i=i+1; ram[i] = { `pow, `s0, `P0 }; // s0=1<<s0, pop s0 - do one hot |
i=i+1; ram[i] = { `not, `s0, `P0 }; // s0~=s0 - invert |
i=i+1; ram[i] = { `reg_w, `s1, `P0 }; // (s1)=s0, pop s0 |
i=i+1; ram[i] = { `jmp_inz, -6'd13, `s1 }; // loop forever |
// loop end |
*/ |
|
// "bouncing ball" 4 LED display w/ PWM |
// |
// s0 : sin |
// s1 : cos |
// s2 : alpha (attenuation factor = speed) |
// s3 : rectified sin, val, one-hot(val) |
// s4 : |
// s5 : pwm counter |
// s6 : |
// s7 : i/o register address |
|
i='h100; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 (sin init) |
i=i+1; ram[i] = { `lit_u, `__, `s1 }; // s1=0x3000,0000 (cos init) |
i=i+1; ram[i] = 16'h3000 ; // |
i=i+1; ram[i] = { `shl_is, 6'd16, `P1 }; // |
i=i+1; ram[i] = { `lit_u, `__, `s2 }; // s2=0x3000 (alpha init) |
i=i+1; ram[i] = 16'h3000 ; // |
i=i+1; ram[i] = { `dat_is, 6'd0, `s5 }; // s5=0 (pwm init) |
i=i+1; ram[i] = { `dat_is, `IO_LO, `s7 }; // s7=reg addr |
// loop start |
// sin & cos |
i=i+1; ram[i] = { `mul_xs, `s2, `s0 }; // s0=s0*s2 (sin*alpha) |
i=i+1; ram[i] = { `sub, `P0, `P1 }; // s1-=s0 (cos-=sin*alpha) |
i=i+1; ram[i] = { `mul_xs, `s2, `s1 }; // s1=s1*s2 (cos*alpha) |
i=i+1; ram[i] = { `add, `P1, `P0 }; // s0-=s1 (sin+=cos*alpha) |
// |sin| |
i=i+1; ram[i] = { `cpy, `s0, `s3 }; // s3=s0 |
i=i+1; ram[i] = { `jmp_inlz, 6'd1, `s3 }; // (s3!<0) ? jmp +1 |
i=i+1; ram[i] = { `not, `s3, `P3 }; // s3~=s3 |
// decimal( |sin| ) + pwm to update, + pwm to get ofl |
i=i+1; ram[i] = { `shl_is, 6'd4, `s3 }; // s3=s3<<4 |
i=i+1; ram[i] = { `add, `s3, `P5 }; // s5+=s3 (update pwm count) |
i=i+1; ram[i] = { `add_xu, `P3, `s5 }; // s5=s5+s3, pop s3 (get pwm ofl) |
// one-hot( int( |sin| ) + pwm ofl ) |
i=i+1; ram[i] = { `shl_is, -6'd28, `P3 }; // s3>>=28 |
i=i+1; ram[i] = { `add, `P5, `P3 }; // s3+=s5, pop s5 (add pwm ofl) |
i=i+1; ram[i] = { `pow, `s3, `P3 }; // s3=1<<s3, pop s3 (one-hot) |
// output |
i=i+1; ram[i] = { `reg_w, `s7, `P3 }; // (s7)=s3, pop s3 |
i=i+1; ram[i] = { `jmp_inz, -6'd15, `s7 }; // loop forever |
// loop end |
|
end |
/trunk/v04.05/alu_multiply.v
0,0 → 1,155
/* |
-------------------------------------------------------------------------------- |
|
Module : alu_multiply |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Signed multiply unit for a processor ALU. |
|
Instantiates: |
- (1x) pipe.v (debug mode only) |
|
Notes: |
- 3 stage 4 register pipeline. |
- Multiply stage I/O registers are likely free (part of multiplier fabric). |
- Debug mode for comparison to native signed multiplication, only use for |
simulation / verification as it consumes resources and negatively impacts |
top speed. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module alu_multiply |
#( |
parameter integer DATA_W = 33, // data width |
parameter integer DEBUG_MODE = 0 // 1=debug mode; 0=normal mode |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// data I/O |
input wire [DATA_W-1:0] a_i, // operand |
input wire [DATA_W-1:0] b_i, // operand |
output reg [DATA_W*2-1:0] result_o, // = ( a_i * b_i ) |
// debug |
output wire debug_o // 1=bad match |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
localparam integer HI_W = DATA_W/2; // 16 |
localparam integer LO_W = DATA_W-HI_W; // 17 |
localparam integer MULT_W = LO_W*2; // 34 |
localparam integer DBL_W = DATA_W*2; // 66 |
// |
reg signed [DATA_W-1:0] a, b; |
wire signed [HI_W-1:0] a_hi, b_hi; |
wire signed [LO_W:0] a_lo_ze, b_lo_ze; // 35 (extra zero MSB) |
reg signed [MULT_W-1:0] mult_hi_hi, mult_hi_lo, mult_lo_hi, mult_lo_lo; |
reg signed [DBL_W-1:0] inner_sum, outer_cat; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// input registering (likely free) |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
a <= 'b0; |
b <= 'b0; |
end else begin |
a <= a_i; |
b <= b_i; |
end |
end |
|
// select & extend inputs |
assign a_hi = a[DATA_W-1:LO_W]; |
assign b_hi = b[DATA_W-1:LO_W]; |
assign a_lo_ze = { 1'b0, a[LO_W-1:0] }; |
assign b_lo_ze = { 1'b0, b[LO_W-1:0] }; |
|
// do all multiplies & register (registers are likely free) |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
mult_hi_hi <= 'b0; |
mult_hi_lo <= 'b0; |
mult_lo_hi <= 'b0; |
mult_lo_lo <= 'b0; |
end else begin |
mult_hi_hi <= a_hi * b_hi; |
mult_hi_lo <= a_hi * b_lo_ze; |
mult_lo_hi <= a_lo_ze * b_hi; |
mult_lo_lo <= a_lo_ze * b_lo_ze; |
end |
end |
|
// add and shift inner terms, concatenate outer terms, register |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
inner_sum <= 'b0; |
outer_cat <= 'b0; |
end else begin |
inner_sum <= ( mult_hi_lo + mult_lo_hi ) << LO_W; |
outer_cat <= { mult_hi_hi[HI_W*2-1:0], mult_lo_lo }; |
end |
end |
|
// final add & register |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
result_o <= 'b0; |
end else begin |
result_o <= outer_cat + inner_sum; |
end |
end |
|
|
// optional debug mode |
generate |
if ( DEBUG_MODE ) begin |
wire signed [DBL_W-1:0] debug_mult, debug_mult_r; |
reg debug; |
assign debug_mult = a * b; |
// delay regs |
pipe |
#( |
.REGS ( 3 ), |
.DATA_W ( DBL_W ), |
.RESET_VAL ( 0 ) |
) |
regs_debug |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( debug_mult ), |
.data_o ( debug_mult_r ) |
); |
// compare & register |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
debug <= 'b0; |
end else begin |
debug <= ( debug_mult_r != result_o ); |
end |
end |
// |
assign debug_o = debug; |
end else begin |
assign debug_o = 'b0; |
end |
endgenerate |
|
|
endmodule |
/trunk/v04.05/boot_code_defs.h
0,0 → 1,100
`include "reg_set_addr.h" |
`include "op_encode.h" |
|
localparam IM_W = 6; |
|
// defines that make programming code more human readable |
`define __ 4'h0 |
`define s0 4'h0 |
`define s1 4'h1 |
`define s2 4'h2 |
`define s3 4'h3 |
`define s4 4'h4 |
`define s5 4'h5 |
`define s6 4'h6 |
`define s7 4'h7 |
`define P0 4'h8 |
`define P1 4'h9 |
`define P2 4'ha |
`define P3 4'hb |
`define P4 4'hc |
`define P5 4'hd |
`define P6 4'he |
`define P7 4'hf |
// |
`define nop op_nop[DATA_W-1:8] |
`define pop op_pop[DATA_W-1:8] |
`define pgc op_pgc[DATA_W-1:8] |
`define lit_s op_lit_s[DATA_W-1:8] |
`define lit_h op_lit_h[DATA_W-1:8] |
`define lit_u op_lit_u[DATA_W-1:8] |
`define reg_rs op_reg_rs[DATA_W-1:8] |
`define reg_rh op_reg_rh[DATA_W-1:8] |
`define reg_w op_reg_w[DATA_W-1:8] |
`define reg_wh op_reg_wh[DATA_W-1:8] |
// |
`define cpy op_cpy[DATA_W-1:8] |
`define nsg op_nsg[DATA_W-1:8] |
`define not op_not[DATA_W-1:8] |
`define flp op_flp[DATA_W-1:8] |
`define lzc op_lzc[DATA_W-1:8] |
`define bra op_bra[DATA_W-1:8] |
`define bro op_bro[DATA_W-1:8] |
`define brx op_brx[DATA_W-1:8] |
`define and op_and[DATA_W-1:8] |
`define orr op_orr[DATA_W-1:8] |
`define xor op_xor[DATA_W-1:8] |
// |
`define add op_add[DATA_W-1:8] |
`define add_xs op_add_xs[DATA_W-1:8] |
`define add_xu op_add_xu[DATA_W-1:8] |
`define sub op_sub[DATA_W-1:8] |
`define sub_xs op_sub_xs[DATA_W-1:8] |
`define sub_xu op_sub_xu[DATA_W-1:8] |
`define mul op_mul[DATA_W-1:8] |
`define mul_xs op_mul_xs[DATA_W-1:8] |
`define mul_xu op_mul_xu[DATA_W-1:8] |
`define shl_s op_shl_s[DATA_W-1:8] |
`define shl_u op_shl_u[DATA_W-1:8] |
`define pow op_pow[DATA_W-1:8] |
// |
`define jmp_z op_jmp_z[DATA_W-1:8] |
`define jmp_nz op_jmp_nz[DATA_W-1:8] |
`define jmp_lz op_jmp_lz[DATA_W-1:8] |
`define jmp_nlz op_jmp_nlz[DATA_W-1:8] |
`define jmp op_jmp[DATA_W-1:8] |
`define gto op_gto[DATA_W-1:8] |
`define gsb op_gsb[DATA_W-1:8] |
// |
`define mem_irs op_mem_irs[DATA_W-1:12] |
`define mem_irh op_mem_irh[DATA_W-1:12] |
`define mem_iw op_mem_iw[DATA_W-1:12] |
`define mem_iwh op_mem_iwh[DATA_W-1:12] |
// |
`define jmp_ie op_jmp_ie[DATA_W-1:12] |
`define jmp_ine op_jmp_ine[DATA_W-1:12] |
`define jmp_ils op_jmp_ils[DATA_W-1:12] |
`define jmp_inls op_jmp_inls[DATA_W-1:12] |
`define jmp_ilu op_jmp_ilu[DATA_W-1:12] |
`define jmp_inlu op_jmp_inlu[DATA_W-1:12] |
// |
`define jmp_iz op_jmp_iz[DATA_W-1:10] |
`define jmp_inz op_jmp_inz[DATA_W-1:10] |
`define jmp_ilz op_jmp_ilz[DATA_W-1:10] |
`define jmp_inlz op_jmp_inlz[DATA_W-1:10] |
// |
`define dat_is op_dat_is[DATA_W-1:10] |
`define add_is op_add_is[DATA_W-1:10] |
`define shl_is op_shl_is[DATA_W-1:10] |
`define psu_i op_psu_i[DATA_W-1:10] |
// |
`define VER VER_ADDR[IM_W-1:0] |
`define THRD_ID THRD_ID_ADDR[IM_W-1:0] |
`define CLR CLR_ADDR[IM_W-1:0] |
`define INTR_EN INTR_EN_ADDR[IM_W-1:0] |
`define OP_ER OP_ER_ADDR[IM_W-1:0] |
`define STK_ER STK_ER_ADDR[IM_W-1:0] |
`define IO_LO IO_LO_ADDR[IM_W-1:0] |
`define IO_HI IO_HI_ADDR[IM_W-1:0] |
`define UART_RX UART_RX_ADDR[IM_W-1:0] |
`define UART_TX UART_TX_ADDR[IM_W-1:0] |
/trunk/v04.05/dds_static.v
0,0 → 1,64
/* |
-------------------------------------------------------------------------------- |
|
Module: dds_static.v |
|
Function: |
- Forms a simple static DDS source. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- Employs phase accumulation, phase increment is multiplication factor. |
- clk_o = clk_i * INC_VAL * 2^-ACCUM_W |
- Output is roughly square, long-term avg of duty cycle is generally 50/50. |
- For correct operation, INC_VAL < 2^(ACCUM_W-1). |
|
-------------------------------------------------------------------------------- |
*/ |
|
module dds_static |
#( |
parameter integer ACCUM_W = 8, // phase accumulator width (bits) |
parameter [ACCUM_W-1:0] INC_VAL = 8 // phase increment value |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async reset, active high |
// |
output wire clk_o // output clock |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
reg [ACCUM_W-1:0] accum; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// accumulate |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
accum <= 'b0; |
end else begin |
accum <= accum + INC_VAL; |
end |
end |
|
// assign output |
assign clk_o = accum[ACCUM_W-1]; |
|
|
endmodule |
/trunk/v04.05/stacks_mux.v
0,0 → 1,121
/* |
-------------------------------------------------------------------------------- |
|
Module : stacks_mux.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Output multiplexer for processor stacks. |
|
Instantiates: |
- (1x) pipe.v |
|
Notes: |
- Purely combinatorial. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module stacks_mux |
#( |
parameter integer DATA_W = 32, // data width |
parameter integer ADDR_W = 16, // address width (bits) |
parameter integer IM_W = 8, // immediate width |
parameter integer STK_W = 3 // stack selector width |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire [STK_W-1:0] data_sel_a_i, // stack selector |
input wire [STK_W-1:0] data_sel_b_i, // stack selector |
input wire [STK_W-1:0] addr_sel_b_i, // stack selector |
input wire imda_i, // 1=immediate data |
input wire imad_i, // 1=immediate address |
// data I/O |
input wire [DATA_W-1:0] pop_data0_i, // stack data |
input wire [DATA_W-1:0] pop_data1_i, // stack data |
input wire [DATA_W-1:0] pop_data2_i, // stack data |
input wire [DATA_W-1:0] pop_data3_i, // stack data |
input wire [DATA_W-1:0] pop_data4_i, // stack data |
input wire [DATA_W-1:0] pop_data5_i, // stack data |
input wire [DATA_W-1:0] pop_data6_i, // stack data |
input wire [DATA_W-1:0] pop_data7_i, // stack data |
input wire [IM_W-1:0] im_i, // immediate |
// |
output wire [DATA_W-1:0] a_data_o, // results |
output wire [DATA_W-1:0] b_data_o, |
output wire [ADDR_W-1:0] b_addr_o |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
reg [DATA_W-1:0] a_data, b_data; |
reg [ADDR_W-1:0] b_addr; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// a data mux |
always @ ( * ) begin |
case ( data_sel_a_i ) |
'd0 : a_data <= pop_data0_i; |
'd1 : a_data <= pop_data1_i; |
'd2 : a_data <= pop_data2_i; |
'd3 : a_data <= pop_data3_i; |
'd4 : a_data <= pop_data4_i; |
'd5 : a_data <= pop_data5_i; |
'd6 : a_data <= pop_data6_i; |
'd7 : a_data <= pop_data7_i; |
endcase |
end |
|
// b data mux |
always @ ( * ) begin |
case ( data_sel_b_i ) |
'd0 : b_data <= pop_data0_i; |
'd1 : b_data <= pop_data1_i; |
'd2 : b_data <= pop_data2_i; |
'd3 : b_data <= pop_data3_i; |
'd4 : b_data <= pop_data4_i; |
'd5 : b_data <= pop_data5_i; |
'd6 : b_data <= pop_data6_i; |
'd7 : b_data <= pop_data7_i; |
endcase |
end |
|
// b address mux |
always @ ( * ) begin |
case ( addr_sel_b_i ) |
'd0 : b_addr <= pop_data0_i[ADDR_W-1:0]; |
'd1 : b_addr <= pop_data1_i[ADDR_W-1:0]; |
'd2 : b_addr <= pop_data2_i[ADDR_W-1:0]; |
'd3 : b_addr <= pop_data3_i[ADDR_W-1:0]; |
'd4 : b_addr <= pop_data4_i[ADDR_W-1:0]; |
'd5 : b_addr <= pop_data5_i[ADDR_W-1:0]; |
'd6 : b_addr <= pop_data6_i[ADDR_W-1:0]; |
'd7 : b_addr <= pop_data7_i[ADDR_W-1:0]; |
endcase |
end |
|
// data |
assign a_data_o = a_data; |
assign b_data_o = ( imda_i ) ? $signed( im_i ) : $signed( b_data ); |
|
// address |
assign b_addr_o = ( imad_i ) ? $signed( im_i ) : $signed( b_addr ); |
|
|
endmodule |
/trunk/v04.05/hive_core.qpf
0,0 → 1,30
# -------------------------------------------------------------------------- # |
# |
# Copyright (C) 1991-2010 Altera Corporation |
# Your use of Altera Corporation's design tools, logic functions |
# and other software and tools, and its AMPP partner logic |
# functions, and any output files from any of the foregoing |
# (including device programming or simulation files), and any |
# associated documentation or information are expressly subject |
# to the terms and conditions of the Altera Program License |
# Subscription Agreement, Altera MegaCore Function License |
# Agreement, or other applicable license agreement, including, |
# without limitation, that your use is for the sole purpose of |
# programming logic devices manufactured by Altera and sold by |
# Altera or its authorized distributors. Please refer to the |
# applicable agreement for further details. |
# |
# -------------------------------------------------------------------------- # |
# |
# Quartus II |
# Version 9.1 Build 350 03/24/2010 Service Pack 2 SJ Web Edition |
# Date created = 19:35:46 December 06, 2013 |
# |
# -------------------------------------------------------------------------- # |
|
QUARTUS_VERSION = "9.1" |
DATE = "19:35:46 December 06, 2013" |
|
# Revisions |
|
PROJECT_REVISION = "hive_core" |
/trunk/v04.05/uart_rx.v
0,0 → 1,246
/* |
-------------------------------------------------------------------------------- |
|
Module: uart_rx.v |
|
Function: |
- Forms the RX side of a DATA_W,n,1 RS232 UART. |
|
Instantiates: |
- functions.h |
|
Notes: |
- Rising edge of baud_clk_i is employed. |
- baud_clk_i / BAUD_OSR = uart baud (bit) rate. |
- baud_clk_i must be synchronous to clk_i. |
- Serial data is non-inverted; quiescent serial state is high (assumes |
external inverting buffer). |
- Bits are in this order (@ serial port of this module, line s/b inverted): |
- 1 start bit (low), |
- DATA_W data bits (LSB first, MSB last), |
- 1 or more stop bits (high). |
- The parallel data interface may be connected to a FIFO or similar. |
- Start & stop errors, if presented, are simultaneous with the write pulse so |
external logic can decide whether or not to accept the data. |
- Start & stop errors are an indication of noise on the line / incorrect baud |
rate. |
- Bad buffer error happens when external data store doesn't take RX data |
before another byte arrives. |
- Parameterized data width. |
- Parameterized oversampling rate. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module uart_rx |
#( |
parameter integer DATA_W = 8, // parallel data width (bits) |
parameter integer BAUD_OSR = 16 // BAUD oversample rate (3 or larger) |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active hi |
// timing interface |
input wire baud_clk_i, // baud clock |
// parallel interface |
output reg [DATA_W-1:0] rx_data_o, // data |
output reg rx_rdy_o, // ready with data, active hi |
input wire rx_rd_i, // data read, active hi |
// serial interface |
input wire rx_i, // serial data |
// debug |
output reg rx_bad_start_o, // bad start bit, active hi |
output reg rx_bad_stop_o, // bad stop bit, active hi |
output reg rx_bad_buffer_o // bad buffering, active hi |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
`include "functions.h" // for clog2() |
// |
localparam integer BIT_PHASE_W = clog2( BAUD_OSR ); |
localparam integer BIT_PHASE_MID = BAUD_OSR/2; |
localparam integer BIT_PHASE_MAX = BAUD_OSR-1; |
localparam integer BIT_COUNT_MAX = DATA_W+1; |
localparam integer BIT_COUNT_W = clog2( BIT_COUNT_MAX ); |
// |
reg [1:0] rx_sr; |
reg baud_clk_reg; |
wire baud_flg; |
// |
reg [BIT_PHASE_W-1:0] bit_phase; |
wire bit_sample_flg, bit_done_flg; |
// |
reg [BIT_COUNT_W-1:0] bit_count; |
wire word_done_flg; |
// |
reg [DATA_W+1:0] rx_data_sr; |
// |
localparam integer STATE_W = 2; // state width (bits) |
reg [STATE_W-1:0] state_sel, state; |
localparam [STATE_W-1:0] |
st_idle = 0, |
st_data = 1, |
st_load = 2, |
st_wait = 3; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
/* |
----------- |
-- input -- |
----------- |
*/ |
|
// register rx_i twice to resync |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
rx_sr <= 2'b11; // note: preset! |
end else begin |
rx_sr <= { rx_sr[0], rx_i }; |
end |
end |
|
// register to detect edges |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
baud_clk_reg <= 'b0; |
end else begin |
baud_clk_reg <= baud_clk_i; |
end |
end |
|
// decode rising edge |
assign baud_flg = ( ~baud_clk_reg & baud_clk_i ); |
|
|
/* |
-------------- |
-- counters -- |
-------------- |
*/ |
|
// form the bit_phase & bit_count up-counters |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
bit_phase <= 'b0; |
bit_count <= 'b0; |
end else begin |
if ( state_sel != st_data ) begin |
bit_phase <= 'b0; |
bit_count <= 'b0; |
end else if ( bit_done_flg ) begin |
bit_phase <= 'b0; |
bit_count <= bit_count + 1'b1; |
end else if ( baud_flg ) begin |
bit_phase <= bit_phase + 1'b1; |
end |
end |
end |
|
// decode flags |
assign bit_sample_flg = ( ( bit_phase == BIT_PHASE_MID[BIT_PHASE_W-1:0] ) & baud_flg ); |
assign bit_done_flg = ( ( bit_phase == BIT_PHASE_MAX[BIT_PHASE_W-1:0] ) & baud_flg ); |
assign word_done_flg = ( ( bit_count == BIT_COUNT_MAX[BIT_COUNT_W-1:0] ) & bit_sample_flg ); |
|
|
/* |
------------------- |
-- state machine -- |
------------------- |
*/ |
|
// select next state |
always @ ( * ) begin |
state_sel <= state; // default: stay in current state |
case ( state ) |
st_idle : begin // idle |
if ( ~rx_sr[1] ) begin |
state_sel <= st_data; // proceed |
end |
end |
st_data : begin // data bits |
if ( word_done_flg ) begin |
state_sel <= st_load; // load |
end |
end |
st_load, st_wait : begin |
if ( rx_sr[1] ) begin |
state_sel <= st_idle; // done |
end else begin |
state_sel <= st_wait; // bad stop bit |
end |
end |
default : begin // for fault tolerance |
state_sel <= st_idle; |
end |
endcase |
end |
|
// register state |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
state <= st_idle; |
end else begin |
state <= state_sel; |
end |
end |
|
|
/* |
--------------------- |
-- data conversion -- |
--------------------- |
*/ |
|
// serial => parallel conversion |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
rx_data_sr <= 'b0; |
end else begin |
if ( bit_sample_flg ) begin |
rx_data_sr <= { rx_sr[1], rx_data_sr[DATA_W+1:1] }; |
end |
end |
end |
|
|
/* |
------------ |
-- output -- |
------------ |
*/ |
|
// register outputs |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
rx_data_o <= 'b0; |
rx_rdy_o <= 'b0; |
rx_bad_start_o <= 'b0; |
rx_bad_stop_o <= 'b0; |
rx_bad_buffer_o <= 'b0; |
end else begin |
if ( state == st_load ) begin |
rx_data_o <= rx_data_sr[DATA_W:1]; |
rx_rdy_o <= 'b1; |
rx_bad_start_o <= rx_data_sr[0]; |
rx_bad_stop_o <= ~rx_data_sr[DATA_W+1]; |
rx_bad_buffer_o <= ( ~rx_rd_i & rx_rdy_o ); |
end else begin |
rx_rdy_o <= ~rx_rd_i & rx_rdy_o; |
end |
end |
end |
|
endmodule |
/trunk/v04.05/dp_ram_infer.v
0,0 → 1,139
/* |
-------------------------------------------------------------------------------- |
|
Module: dp_ram_infer.v |
|
Function: |
- Infers a parameterized dual port synchronous RAM. |
|
Instantiates: |
- Nothing (block RAM will most likely be synthesized). |
|
Notes: |
- A & B sides are separate clock domains. |
- Writes accept data after the address & write enable on the clock. |
- Reads present data after the address on the clock. |
- Configurable read-during-write mode (for the same port). |
- Optional output data registering (likely an internal BRAM resource). |
|
-------------------------------------------------------------------------------- |
*/ |
|
module dp_ram_infer |
#( |
parameter integer REG_A_OUT = 1, // 1=enable A output registering |
parameter integer REG_B_OUT = 1, // 1=enable B output registering |
parameter integer DATA_W = 16, |
parameter integer ADDR_W = 8, |
parameter MODE = "RAW" // options here are "WAR" and "RAW" |
) |
( |
// A side |
input wire a_clk_i, // A clock |
input wire [ADDR_W-1:0] a_addr_i, // A address |
input wire a_wr_i, // A write enable, active high |
input wire [DATA_W-1:0] a_data_i, // A write data |
output wire [DATA_W-1:0] a_data_o, // A read data |
// B side |
input wire b_clk_i, // B clock |
input wire [ADDR_W-1:0] b_addr_i, // B address |
input wire b_wr_i, // B write enable, active high |
input wire [DATA_W-1:0] b_data_i, // B write data |
output wire [DATA_W-1:0] b_data_o // B read data |
); |
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
localparam integer CAPACITY = 2**ADDR_W; // total words possible to store |
reg [DATA_W-1:0] ram[0:CAPACITY-1]; // memory |
reg [DATA_W-1:0] a_data, b_data; |
// |
localparam integer MEM_DATA_W = DATA_W; |
`include "boot_code.h" |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
|
/* |
------------ |
-- side A -- |
------------ |
*/ |
|
// write |
always @ ( posedge a_clk_i ) begin |
if ( a_wr_i ) begin |
ram[a_addr_i] <= a_data_i; |
end |
end |
|
// read |
always @ ( posedge a_clk_i ) begin |
if ( a_wr_i & MODE == "RAW" ) begin |
a_data <= a_data_i; // read after write |
end else begin |
a_data <= ram[a_addr_i]; // write after read |
end |
end |
|
// optional output reg |
generate |
if ( REG_A_OUT ) begin |
reg [DATA_W-1:0] a_data_r; |
always @ ( posedge a_clk_i ) begin |
a_data_r <= a_data; |
end |
assign a_data_o = a_data_r; |
end else begin |
assign a_data_o = a_data; |
end |
endgenerate |
|
|
/* |
------------ |
-- side B -- |
------------ |
*/ |
|
// write |
always @ ( posedge b_clk_i ) begin |
if ( b_wr_i ) begin |
ram[b_addr_i] <= b_data_i; |
end |
end |
|
// read |
always @ ( posedge b_clk_i ) begin |
if ( b_wr_i & MODE == "RAW" ) begin |
b_data <= b_data_i; // read after write |
end else begin |
b_data <= ram[b_addr_i]; // write after read |
end |
end |
|
// optional output reg |
generate |
if ( REG_B_OUT ) begin |
reg [DATA_W-1:0] b_data_r; |
always @ ( posedge b_clk_i ) begin |
b_data_r <= b_data; |
end |
assign b_data_o = b_data_r; |
end else begin |
assign b_data_o = b_data; |
end |
endgenerate |
|
|
endmodule |
/trunk/v04.05/ep4ce6e22c8_demo_board.qpf
0,0 → 1,30
# -------------------------------------------------------------------------- # |
# |
# Copyright (C) 1991-2011 Altera Corporation |
# Your use of Altera Corporation's design tools, logic functions |
# and other software and tools, and its AMPP partner logic |
# functions, and any output files from any of the foregoing |
# (including device programming or simulation files), and any |
# associated documentation or information are expressly subject |
# to the terms and conditions of the Altera Program License |
# Subscription Agreement, Altera MegaCore Function License |
# Agreement, or other applicable license agreement, including, |
# without limitation, that your use is for the sole purpose of |
# programming logic devices manufactured by Altera and sold by |
# Altera or its authorized distributors. Please refer to the |
# applicable agreement for further details. |
# |
# -------------------------------------------------------------------------- # |
# |
# Quartus II |
# Version 10.1 Build 197 01/19/2011 Service Pack 1 SJ Web Edition |
# Date created = 11:55:43 November 11, 2013 |
# |
# -------------------------------------------------------------------------- # |
|
QUARTUS_VERSION = "10.1" |
DATE = "11:55:43 November 11, 2013" |
|
# Revisions |
|
PROJECT_REVISION = "ep4ce6e22c8_demo_board" |
/trunk/v04.05/dq_ram_infer.v
0,0 → 1,85
/* |
-------------------------------------------------------------------------------- |
|
Module: dq_ram_infer.v |
|
Function: |
- Infers a parameterized simple DQ synchronous RAM. |
|
Instantiates: |
- Nothing (block RAM will most likely be synthesized). |
|
Notes: |
- Writes accept data after the address & write enable on the clock. |
- Reads present data after the address on the clock. |
- Configurable read-during-write mode. |
- Optional output data registering (likely an internal BRAM resource). |
|
-------------------------------------------------------------------------------- |
*/ |
|
module dq_ram_infer |
#( |
parameter integer REG_OUT = 1, // 1=enable output registering |
parameter integer DATA_W = 16, |
parameter integer ADDR_W = 8, |
parameter MODE = "RAW" // options here are "WAR" and "RAW" |
) |
( |
input wire clk_i, // clock |
input wire [ADDR_W-1:0] addr_i, // address |
input wire wr_i, // write enable, active high |
input wire [DATA_W-1:0] data_i, // write data |
output wire [DATA_W-1:0] data_o // read data |
); |
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
localparam integer CAPACITY = 2**ADDR_W; // total words possible to store |
reg [DATA_W-1:0] ram[0:CAPACITY-1]; // memory |
reg [DATA_W-1:0] data; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
|
// write |
always @ ( posedge clk_i ) begin |
if ( wr_i ) begin |
ram[addr_i] <= data_i; |
end |
end |
|
// read |
always @ ( posedge clk_i ) begin |
if ( wr_i & MODE == "RAW" ) begin |
data <= data_i; // read after write |
end else begin |
data <= ram[addr_i]; // write after read |
end |
end |
|
// optional output reg |
generate |
if ( REG_OUT == 1 ) begin |
reg [DATA_W-1:0] data_r; |
always @ ( posedge clk_i ) begin |
data_r <= data; |
end |
assign data_o = data_r; |
end else begin |
assign data_o = data; |
end |
endgenerate |
|
|
endmodule |
/trunk/v04.05/thread_ring.v
0,0 → 1,84
/* |
-------------------------------------------------------------------------------- |
|
Module : thread_ring.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Processor thread pipeline. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- 8 stage pipeline. |
- Counter in stage 0 ensures long-term correct operation. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module thread_ring |
#( |
parameter integer THREADS = 8, // threads |
parameter integer THRD_W = 3 // thread width |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// threads |
output wire [THRD_W-1:0] thrd_0_o, |
output wire [THRD_W-1:0] thrd_1_o, |
output wire [THRD_W-1:0] thrd_2_o, |
output wire [THRD_W-1:0] thrd_3_o, |
output wire [THRD_W-1:0] thrd_4_o, |
output wire [THRD_W-1:0] thrd_5_o, |
output wire [THRD_W-1:0] thrd_6_o, |
output wire [THRD_W-1:0] thrd_7_o |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
reg [THRD_W-1:0] thrd[0:THREADS-1]; |
localparam [THRD_W-1:0] THRD_OS = 'd5; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// pipeline thread |
integer j; |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
for ( j = 0; j < THREADS; j = j + 1 ) begin |
thrd[j] <= THRD_OS - j[THRD_W-1:0]; |
end |
end else begin |
for ( j = 0; j < THREADS; j = j + 1 ) begin |
if ( j == 0 ) thrd[j] <= thrd[j] + 1'b1; // note: counter terminus |
else thrd[j] <= thrd[j-1]; |
end |
end |
end |
|
// output thrd |
assign thrd_0_o = thrd[0]; |
assign thrd_1_o = thrd[1]; |
assign thrd_2_o = thrd[2]; |
assign thrd_3_o = thrd[3]; |
assign thrd_4_o = thrd[4]; |
assign thrd_5_o = thrd[5]; |
assign thrd_6_o = thrd[6]; |
assign thrd_7_o = thrd[7]; |
|
|
endmodule |
/trunk/v04.05/uart_tx.v
0,0 → 1,236
/* |
-------------------------------------------------------------------------------- |
|
Module: uart_tx.v |
|
Function: |
- Forms the TX side of a DATA_W,n,STOP_BITS RS232 UART. |
|
Instantiates: |
- functions.h |
|
Notes: |
- Rising edge of baud_clk_i is employed. |
- baud_clk_i / BAUD_OSR = uart baud (bit) rate. |
- baud_clk_i mist be synchronous to clk_i. |
- Serial data is non-inverted; quiescent serial state is high (assumes |
external inverting buffer). |
- Bits are in this order (@ serial port of this module, line s/b inverted): |
- 1 start bit (low), |
- DATA_W data bits (LSB first, MSB last), |
- 1 or more stop bits (high). |
- The parallel data interface may be connected to a FIFO or similar. |
- Parameterized data width. |
- Parameterized oversampling rate. |
- Parameterized stop bits. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module uart_tx |
#( |
parameter integer DATA_W = 8, // parallel data width (bits) |
parameter integer BAUD_OSR = 16, // BAUD clock oversample rate (3 or larger) |
parameter integer STOP_BITS = 1 // number of stop bits |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active hi |
// timing interface |
input wire baud_clk_i, // baud clock |
// parallel interface |
input wire [DATA_W-1:0] tx_data_i, // data |
output reg tx_rdy_o, // ready for data, active hi |
input wire tx_wr_i, // data write, active high |
// serial interface |
output wire tx_o // serial data |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
`include "functions.h" // for clog2() |
// |
localparam integer BIT_PHASE_W = clog2( BAUD_OSR ); |
localparam integer BIT_PHASE_MAX = BAUD_OSR-1; |
localparam integer BIT_COUNT_MAX = DATA_W+STOP_BITS; |
localparam integer BIT_COUNT_W = clog2( BIT_COUNT_MAX ); |
// |
reg baud_clk_reg; |
wire baud_flg; |
reg [DATA_W-1:0] tx_data_reg; |
// |
reg [BIT_PHASE_W-1:0] bit_phase; |
wire bit_done_flg; |
// |
reg [BIT_COUNT_W-1:0] bit_count; |
wire word_done_flg; |
// |
reg [DATA_W:0] tx_data_sr; |
wire load_flg; |
// |
localparam integer STATE_W = 2; // state width (bits) |
reg [STATE_W-1:0] state_sel, state; |
localparam [STATE_W-1:0] |
st_idle = 0, |
st_wait = 1, |
st_load = 2, |
st_data = 3; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
/* |
----------- |
-- input -- |
----------- |
*/ |
|
// register to detect edges |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
baud_clk_reg <= 'b0; |
end else begin |
baud_clk_reg <= baud_clk_i; |
end |
end |
|
// decode rising edge |
assign baud_flg = ( ~baud_clk_reg & baud_clk_i ); |
|
// register parallel data |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
tx_data_reg <= 'b0; |
tx_rdy_o <= 'b1; |
end else begin |
if ( tx_wr_i ) begin |
tx_data_reg <= tx_data_i; |
tx_rdy_o <= 'b0; |
end else if ( load_flg ) begin |
tx_rdy_o <= 'b1; |
end |
end |
end |
|
|
/* |
-------------- |
-- counters -- |
-------------- |
*/ |
|
// form the bit_phase & bit_count up-counters |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
bit_phase <= 'b0; |
bit_count <= 'b0; |
end else begin |
if ( state_sel != st_data ) begin |
bit_phase <= 'b0; |
bit_count <= 'b0; |
end else if ( bit_done_flg ) begin |
bit_phase <= 'b0; |
bit_count <= bit_count + 1'b1; |
end else if ( baud_flg ) begin |
bit_phase <= bit_phase + 1'b1; |
end |
end |
end |
|
// decode flags |
assign bit_done_flg = ( ( bit_phase == BIT_PHASE_MAX[BIT_PHASE_W-1:0] ) & baud_flg ); |
assign word_done_flg = ( ( bit_count == BIT_COUNT_MAX[BIT_COUNT_W-1:0] ) & bit_done_flg ); |
|
|
/* |
------------------- |
-- state machine -- |
------------------- |
*/ |
|
// select next state |
always @ ( * ) begin |
state_sel <= state; // default: stay in current state |
case ( state ) |
st_idle : begin // idle |
if ( ~tx_rdy_o ) begin |
state_sel <= st_wait; // proceed |
end |
end |
st_wait : begin // wait for baud sync |
if ( baud_flg ) begin |
state_sel <= st_load; // proceed |
end |
end |
st_load : begin // load |
state_sel <= st_data; // proceed |
end |
st_data : begin // data bits |
if ( word_done_flg ) begin |
if ( ~tx_rdy_o ) begin |
state_sel <= st_load; // do again |
end else begin |
state_sel <= st_idle; // done |
end |
end |
end |
default : begin // for fault tolerance |
state_sel <= st_idle; |
end |
endcase |
end |
|
// register state |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
state <= st_idle; |
end else begin |
state <= state_sel; |
end |
end |
|
// decode flags |
assign load_flg = ( state_sel == st_load ); |
|
|
/* |
--------------------- |
-- data conversion -- |
--------------------- |
*/ |
|
// parallel => serial conversion |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
tx_data_sr <= { (DATA_W+1){1'b1} }; |
end else begin |
if ( load_flg ) begin |
tx_data_sr <= { tx_data_reg, 1'b0 }; |
end else if ( bit_done_flg ) begin |
tx_data_sr <= { 1'b1, tx_data_sr[DATA_W:1] }; |
end |
end |
end |
|
|
/* |
------------ |
-- output -- |
------------ |
*/ |
|
// outputs |
assign tx_o = tx_data_sr[0]; |
|
|
endmodule |
/trunk/v04.05/data_ring.v
0,0 → 1,338
/* |
-------------------------------------------------------------------------------- |
|
Module : data_ring.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Processor data path & data stacks. |
|
Instantiates: |
- (1x) stacks_mux.v |
- (1x) alu_top.v |
- (1x) pointer_ring.v |
- (8x) dq_ram_infer.v |
|
Notes: |
- 8 stage data pipeline beginning and ending on 8 BRAM based LIFOs. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module data_ring |
#( |
parameter integer DATA_W = 32, // data width |
parameter integer ADDR_W = 16, // address width |
parameter integer THREADS = 8, // threads |
parameter integer THRD_W = 3, // thread selector width |
parameter integer STACKS = 8, // stacks |
parameter integer STK_W = 3, // stack selector width |
parameter integer PNTR_W = 5, // stack pointer width |
parameter integer IM_W = 6, // immediate width |
parameter integer LG_SEL_W = 4, // operation width |
parameter integer PROT_POP = 1, // 1=error protection, 0=none |
parameter integer PROT_PUSH = 1 // 1=error protection, 0=none |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire [STK_W-1:0] data_sel_a_i, // stack selector |
input wire [STK_W-1:0] data_sel_b_i, // stack selector |
input wire [STK_W-1:0] addr_sel_b_i, // stack selector |
input wire imda_i, // 1=immediate data |
input wire imad_i, // 1=immediate address |
input wire sgn_i, // 1=signed |
input wire ext_i, // 1=extended result |
input wire hgh_i, // 1=high |
input wire [LG_SEL_W-1:0] lg_sel_i, // logic operation (see lg_sel_encode.h) |
input wire add_i, // 1=add |
input wire sub_i, // 1=subtract |
input wire mul_i, // 1=multiply |
input wire shl_i, // 1=shift left |
input wire pow_i, // 1=power of 2 |
input wire rtn_i, // 1=return pc |
input wire dm_rd_i, // 1=read |
input wire rg_rd_i, // 1=read |
// stack I/O |
input wire stk_clr_i, // stacks clear |
input wire [STACKS-1:0] pop_i, // stacks pop |
input wire [STACKS-1:0] push_i, // stacks push |
input wire [THRD_W-1:0] thrd_6_i, // thread |
// data I/O |
input wire [IM_W-1:0] im_i, // immediate |
input wire [DATA_W/2-1:0] dm_rd_data_4_i, // dmem read data |
input wire [DATA_W/2-1:0] rg_rd_data_4_i, // regs read data |
input wire [ADDR_W-1:0] pc_3_i, // program counter |
output wire [DATA_W-1:0] a_data_o, // a |
output wire [ADDR_W-1:0] b_addr_o, // b |
// flags |
output wire flg_nz_2_o, // a != 0 |
output wire flg_lz_2_o, // a < 0 |
output wire flg_ne_2_o, // a != b |
output wire flg_lt_2_o, // a < b |
// errors |
output wire [STACKS-1:0] pop_er_2_o, // pop when empty, active high |
output wire [STACKS-1:0] push_er_3_o // push when full, active high |
); |
|
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
wire [DATA_W-1:0] b_data; |
wire [DATA_W-1:0] pop_data0, pop_data1, pop_data2, pop_data3, pop_data4, pop_data5, pop_data6, pop_data7, push_data_6; |
wire [PNTR_W-1:0] pntr0_6, pntr1_6, pntr2_6, pntr3_6, pntr4_6, pntr5_6, pntr6_6, pntr7_6; |
wire [STACKS-1:0] stk_wr_6; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
|
// stacks output mux |
stacks_mux |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.IM_W ( IM_W ), |
.STK_W ( STK_W ) |
) |
stacks_mux |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_sel_a_i ( data_sel_a_i ), |
.data_sel_b_i ( data_sel_b_i ), |
.addr_sel_b_i ( addr_sel_b_i ), |
.imda_i ( imda_i ), |
.imad_i ( imad_i ), |
.pop_data0_i ( pop_data0 ), |
.pop_data1_i ( pop_data1 ), |
.pop_data2_i ( pop_data2 ), |
.pop_data3_i ( pop_data3 ), |
.pop_data4_i ( pop_data4 ), |
.pop_data5_i ( pop_data5 ), |
.pop_data6_i ( pop_data6 ), |
.pop_data7_i ( pop_data7 ), |
.im_i ( im_i ), |
.a_data_o ( a_data_o ), |
.b_data_o ( b_data ), |
.b_addr_o ( b_addr_o ) |
); |
|
|
// ALU |
alu_top |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.LG_SEL_W ( LG_SEL_W ) |
) |
alu_top |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.sgn_i ( sgn_i ), |
.ext_i ( ext_i ), |
.hgh_i ( hgh_i ), |
.lg_sel_i ( lg_sel_i ), |
.add_i ( add_i ), |
.sub_i ( sub_i ), |
.mul_i ( mul_i ), |
.shl_i ( shl_i ), |
.pow_i ( pow_i ), |
.rtn_i ( rtn_i ), |
.dm_rd_i ( dm_rd_i ), |
.rg_rd_i ( rg_rd_i ), |
.a_i ( a_data_o ), |
.b_i ( b_data ), |
.dm_rd_data_4_i ( dm_rd_data_4_i ), |
.rg_rd_data_4_i ( rg_rd_data_4_i ), |
.pc_3_i ( pc_3_i ), |
.result_6_o ( push_data_6 ), |
.flg_nz_2_o ( flg_nz_2_o ), |
.flg_lz_2_o ( flg_lz_2_o ), |
.flg_ne_2_o ( flg_ne_2_o ), |
.flg_lt_2_o ( flg_lt_2_o ) |
); |
|
|
// stack pointer generation & storage |
pointer_ring |
#( |
.THREADS ( THREADS ), |
.STACKS ( STACKS ), |
.PNTR_W ( PNTR_W ), |
.PROT_POP ( PROT_POP ), |
.PROT_PUSH ( PROT_PUSH ) |
) |
pointer_ring |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.clr_i ( stk_clr_i ), |
.pop_i ( pop_i ), |
.push_i ( push_i ), |
.pntr0_6_o ( pntr0_6 ), |
.pntr1_6_o ( pntr1_6 ), |
.pntr2_6_o ( pntr2_6 ), |
.pntr3_6_o ( pntr3_6 ), |
.pntr4_6_o ( pntr4_6 ), |
.pntr5_6_o ( pntr5_6 ), |
.pntr6_6_o ( pntr6_6 ), |
.pntr7_6_o ( pntr7_6 ), |
.wr_6_o ( stk_wr_6 ), |
.pop_er_2_o ( pop_er_2_o ), |
.push_er_3_o ( push_er_3_o ) |
); |
|
|
// LIFO stacks memory |
dq_ram_infer |
#( |
.REG_OUT ( 1 ), |
.DATA_W ( DATA_W ), |
.ADDR_W ( THRD_W+PNTR_W ), |
.MODE ( "RAW" ) |
) |
stack0_dq_ram |
( |
.clk_i ( clk_i ), |
.addr_i ( { thrd_6_i, pntr0_6 } ), |
.wr_i ( stk_wr_6[0] ), |
.data_i ( push_data_6 ), |
.data_o ( pop_data0 ) |
); |
|
|
dq_ram_infer |
#( |
.REG_OUT ( 1 ), |
.DATA_W ( DATA_W ), |
.ADDR_W ( THRD_W+PNTR_W ), |
.MODE ( "RAW" ) |
) |
stack1_dq_ram |
( |
.clk_i ( clk_i ), |
.addr_i ( { thrd_6_i, pntr1_6 } ), |
.wr_i ( stk_wr_6[1] ), |
.data_i ( push_data_6 ), |
.data_o ( pop_data1 ) |
); |
|
|
dq_ram_infer |
#( |
.REG_OUT ( 1 ), |
.DATA_W ( DATA_W ), |
.ADDR_W ( THRD_W+PNTR_W ), |
.MODE ( "RAW" ) |
) |
stack2_dq_ram |
( |
.clk_i ( clk_i ), |
.addr_i ( { thrd_6_i, pntr2_6 } ), |
.wr_i ( stk_wr_6[2] ), |
.data_i ( push_data_6 ), |
.data_o ( pop_data2 ) |
); |
|
|
dq_ram_infer |
#( |
.REG_OUT ( 1 ), |
.DATA_W ( DATA_W ), |
.ADDR_W ( THRD_W+PNTR_W ), |
.MODE ( "RAW" ) |
) |
stack3_dq_ram |
( |
.clk_i ( clk_i ), |
.addr_i ( { thrd_6_i, pntr3_6 } ), |
.wr_i ( stk_wr_6[3] ), |
.data_i ( push_data_6 ), |
.data_o ( pop_data3 ) |
); |
|
|
dq_ram_infer |
#( |
.REG_OUT ( 1 ), |
.DATA_W ( DATA_W ), |
.ADDR_W ( THRD_W+PNTR_W ), |
.MODE ( "RAW" ) |
) |
stack4_dq_ram |
( |
.clk_i ( clk_i ), |
.addr_i ( { thrd_6_i, pntr4_6 } ), |
.wr_i ( stk_wr_6[4] ), |
.data_i ( push_data_6 ), |
.data_o ( pop_data4 ) |
); |
|
|
dq_ram_infer |
#( |
.REG_OUT ( 1 ), |
.DATA_W ( DATA_W ), |
.ADDR_W ( THRD_W+PNTR_W ), |
.MODE ( "RAW" ) |
) |
stack5_dq_ram |
( |
.clk_i ( clk_i ), |
.addr_i ( { thrd_6_i, pntr5_6 } ), |
.wr_i ( stk_wr_6[5] ), |
.data_i ( push_data_6 ), |
.data_o ( pop_data5 ) |
); |
|
|
dq_ram_infer |
#( |
.REG_OUT ( 1 ), |
.DATA_W ( DATA_W ), |
.ADDR_W ( THRD_W+PNTR_W ), |
.MODE ( "RAW" ) |
) |
stack6_dq_ram |
( |
.clk_i ( clk_i ), |
.addr_i ( { thrd_6_i, pntr6_6 } ), |
.wr_i ( stk_wr_6[6] ), |
.data_i ( push_data_6 ), |
.data_o ( pop_data6 ) |
); |
|
|
dq_ram_infer |
#( |
.REG_OUT ( 1 ), |
.DATA_W ( DATA_W ), |
.ADDR_W ( THRD_W+PNTR_W ), |
.MODE ( "RAW" ) |
) |
stack7_dq_ram |
( |
.clk_i ( clk_i ), |
.addr_i ( { thrd_6_i, pntr7_6 } ), |
.wr_i ( stk_wr_6[7] ), |
.data_i ( push_data_6 ), |
.data_o ( pop_data7 ) |
); |
|
|
endmodule |
/trunk/v04.05/functions.h
0,0 → 1,95
/* |
-------------------------------------------------------------------------------- |
-- |
-- Module : functions.h |
-- |
-------------------------------------------------------------------------------- |
-- |
-- Function: |
-- - A bunch of functions for a stack processor. |
-- |
-- Instantiates: |
-- - Nothing. |
-- |
-------------------------------------------------------------------------------- |
*/ |
|
|
/* |
--------------- |
-- functions -- |
--------------- |
*/ |
|
|
// returns safe ceiling value of log2(n) |
// (for vector sizing we never want less than 1) |
// examples: |
// clog2(0 thru 2) = 1, |
// clog2(3 & 4) = 2, |
// clog2(5 thru 8) = 3, |
// clog2(9 thru 16) = 4, etc. |
function integer clog2; |
input integer in; |
begin |
clog2 = 1; |
while ( in > 2 ) begin |
in = ( in + 1 ) / 2; |
clog2 = clog2 + 1; |
end |
end |
endfunction |
|
|
// flip 32 bit value |
function [31:0] flip_32; |
input [31:0] in; |
integer i; |
begin |
for ( i=0; i<32; i=i+1 ) begin |
flip_32[i] = in[31-i]; |
end |
end |
endfunction |
|
|
// return leading zero count of 32 bit value |
// examples: |
// lzc_32(32'b000...000) = 32 |
// lzc_32(32'b000...001) = 31 |
// lzc_32(32'b000...01x) = 30 |
// ... |
// lzc_32(32'b001...xxx) = 2 |
// lzc_32(32'b01x...xxx) = 1 |
// lzc_32(32'b1xx...xxx) = 0 |
function [5:0] lzc_32; |
input [31:0] in; |
integer j, hi_1, all_0; |
begin |
hi_1 = 31; |
all_0 = 1; |
// priority encoder (find MSB 1 position) |
for ( j = 0; j < 32; j = j + 1 ) begin |
if ( in[j] ) begin |
hi_1 = j; |
all_0 = 0; |
end |
end |
end |
// invert & concat to get zero count |
lzc_32 = { all_0[0], ~hi_1[4:0] }; |
endfunction |
|
|
// returns the max of 2 integers |
function integer max_of_2; |
input integer a, b; |
begin |
if ( a > b ) begin |
max_of_2 = a; |
end else begin |
max_of_2 = b; |
end |
end |
endfunction |
|
/trunk/v04.05/pipe.v
0,0 → 1,71
/* |
-------------------------------------------------------------------------------- |
|
Module: pipe.v |
|
Function: |
- Vector I/O shift register. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- Parameters for depth (register stages), data width, and async reset value. |
- DEPTH=0 generates a wire. |
|
-------------------------------------------------------------------------------- |
*/ |
|
|
module pipe |
#( |
parameter integer DEPTH = 4, // register stages |
parameter integer WIDTH = 2, // I/O data width |
parameter [WIDTH-1:0] RESET_VAL = 0 // regs async reset value |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// I/O |
input wire [WIDTH-1:0] data_i, // data in |
output wire [WIDTH-1:0] data_o // data out |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
genvar i; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// generate regs pipeline |
generate |
if ( DEPTH == 0 ) begin |
assign data_o = data_i; |
end else begin |
reg [WIDTH-1:0] stage[0:DEPTH-1]; |
for ( i=0; i<DEPTH; i=i+1 ) begin : loop |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
stage[i] <= RESET_VAL; |
end else begin |
stage[i] <= ( i == DEPTH-1 ) ? data_i : stage[i+1]; |
end |
end |
end // endfor : loop |
assign data_o = stage[0]; |
end |
endgenerate |
|
|
endmodule |
/trunk/v04.05/pointer_ring.v
0,0 → 1,191
/* |
-------------------------------------------------------------------------------- |
|
Module : pointer_ring.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Processor stack pointer storage ring. |
|
Instantiates: |
- (1x) pipe.v |
|
Notes: |
- 8 stage pointer storage ring for 8 BRAM based LIFOs: |
0 : clear applied (& all inputs) |
1 : pop applied |
2 : push applied; pop errors output |
3 : push errors output |
6 : pointers & writes output |
- Logic assumes pop | push will not be issued simultaneously with clear. |
- Externally concatenate thread 6 & pointers to form stack memory addresses. |
- Level width is PTR_W+1 to accomodate 0 to 2^n levels (1 + 2n states). |
- Empty push is to address 1, full push is to address 0. |
- Combo pop/push is accomodated with no net fullness/pointer change. |
- Pop when empty is a pop error. |
- Push when full is a push error. |
- Pop/push when full is NOT an error. |
- Pop/push when empty is a pop error ONLY. |
- Parameterized stack error handling. If the associated protection is turned on |
then pop/push errors are reported but otherwise not acted upon, i.e. errors |
will not corrupt fullness/pointers. If the associated protection is turned |
off then errors are still reported, but fullness/pointers will be corrupted. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module pointer_ring |
#( |
parameter integer THREADS = 8, // threads |
parameter integer STACKS = 8, // stacks |
parameter integer PNTR_W = 5, // stack pointer width |
parameter integer PROT_POP = 1, // 1=error protection, 0=none |
parameter integer PROT_PUSH = 1 // 1=error protection, 0=none |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire clr_i, // stacks clear |
input wire [STACKS-1:0] pop_i, // stacks pop |
input wire [STACKS-1:0] push_i, // stacks push |
// pointers |
output wire [PNTR_W-1:0] pntr0_6_o, // stack pointer |
output wire [PNTR_W-1:0] pntr1_6_o, // stack pointer |
output wire [PNTR_W-1:0] pntr2_6_o, // stack pointer |
output wire [PNTR_W-1:0] pntr3_6_o, // stack pointer |
output wire [PNTR_W-1:0] pntr4_6_o, // stack pointer |
output wire [PNTR_W-1:0] pntr5_6_o, // stack pointer |
output wire [PNTR_W-1:0] pntr6_6_o, // stack pointer |
output wire [PNTR_W-1:0] pntr7_6_o, // stack pointer |
// write enables |
output wire [STACKS-1:0] wr_6_o, // write enables |
// errors |
output wire [STACKS-1:0] pop_er_2_o, // pop when empty, active high |
output wire [STACKS-1:0] push_er_3_o // push when full, active high |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
localparam integer LEVEL_W = PNTR_W+1; // +1 extra bit |
localparam [LEVEL_W-1:0] EMPTY_VAL = 'b0; // empty value |
localparam [LEVEL_W-1:0] FULL_VAL = 1'b1 << PNTR_W; // full value |
// |
integer s, t; |
// |
reg [LEVEL_W-1:0] level[0:STACKS-1][0:THREADS-1]; |
// |
reg [STACKS-1:0] pop_1, push_1, push_2; |
reg [STACKS-1:0] empty_1, full_2; |
wire [STACKS-1:0] dec_1, inc_2; |
wire [STACKS-1:0] pop_er_1, push_er_2; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// pipeline control signals |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
pop_1 <= 'b0; |
push_1 <= 'b0; |
push_2 <= 'b0; |
end else begin |
pop_1 <= pop_i; |
push_1 <= push_i; |
push_2 <= push_1; |
end |
end |
|
// decode watermarks |
always @ ( * ) begin |
for ( s=0; s<STACKS; s=s+1 ) begin |
empty_1[s] <= ( level[s][1] == EMPTY_VAL ); |
full_2[s] <= ( level[s][2] == FULL_VAL ); |
end |
end |
|
// prohibit pointer changes @ errors if configured to do so |
assign dec_1 = ( PROT_POP ) ? pop_1 & ~empty_1 : pop_1; |
assign inc_2 = ( PROT_PUSH ) ? push_2 & ~full_2 : push_2; |
|
// decode errors - pop when empty, push when full |
assign pop_er_1 = pop_1 & empty_1; |
assign push_er_2 = push_2 & full_2; |
|
// decode & pipeline levels |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
for ( s=0; s<STACKS; s=s+1 ) begin |
for ( t=0; t<THREADS; t=t+1 ) begin |
level[s][t] <= 'b0; |
end |
end |
end else begin |
for ( s=0; s<STACKS; s=s+1 ) begin |
for ( t=0; t<THREADS; t=t+1 ) begin |
if ( t == 0 ) level[s][t] <= level[s][THREADS-1]; // wrap around |
else if ( t == 1 ) level[s][t] <= ( clr_i ) ? 1'b0 : level[s][t-1]; // clear |
else if ( t == 2 ) level[s][t] <= ( dec_1[s] ) ? level[s][t-1] - 1'b1 : level[s][t-1]; // pop |
else if ( t == 3 ) level[s][t] <= ( inc_2[s] ) ? level[s][t-1] + 1'b1 : level[s][t-1]; // push |
else level[s][t] <= level[s][t-1]; |
end |
end |
end |
end |
|
|
// decode & pipeline write enables |
pipe |
#( |
.DEPTH ( 4 ), |
.WIDTH ( STACKS ), |
.RESET_VAL ( 0 ) |
) |
wr_pipe |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( inc_2 ), |
.data_o ( wr_6_o ) |
); |
|
|
// register output errors |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( STACKS+STACKS ), |
.RESET_VAL ( 0 ) |
) |
reg_errors |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { pop_er_1, push_er_2 } ), |
.data_o ( { pop_er_2_o, push_er_3_o } ) |
); |
|
|
// output pointers |
assign pntr0_6_o = level[0][6][PNTR_W-1:0]; |
assign pntr1_6_o = level[1][6][PNTR_W-1:0]; |
assign pntr2_6_o = level[2][6][PNTR_W-1:0]; |
assign pntr3_6_o = level[3][6][PNTR_W-1:0]; |
assign pntr4_6_o = level[4][6][PNTR_W-1:0]; |
assign pntr5_6_o = level[5][6][PNTR_W-1:0]; |
assign pntr6_6_o = level[6][6][PNTR_W-1:0]; |
assign pntr7_6_o = level[7][6][PNTR_W-1:0]; |
|
|
endmodule |
/trunk/v04.05/control_ring.v
0,0 → 1,294
/* |
-------------------------------------------------------------------------------- |
|
Module : control_ring.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Processor control path. |
|
Instantiates: |
- (1x) thread_ring.v |
- (2x) event_ctrl.v |
- (1x) tst_decode.v |
- (1x) op_decode.v |
- (1x) pc_ring.v |
|
Notes: |
- 8 stage pipeline consisting of several storage rings. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module control_ring |
#( |
parameter integer DATA_W = 32, // data width |
parameter integer ADDR_W = 16, // address width |
parameter integer THREADS = 8, // threads |
parameter integer THRD_W = 3, // thread width |
parameter integer STACKS = 8, // number of stacks |
parameter integer STK_W = 3, // stack selector width |
parameter integer IM_W = 6, // immediate width |
parameter integer MEM_DATA_W = 16, // opcode width |
parameter integer LG_SEL_W = 4, // logical operation width |
parameter [ADDR_W-1:0] CLR_BASE = 'h0, // clear address base (concat) |
parameter integer CLR_SPAN = 2, // clear address span (2^n) |
parameter [ADDR_W-1:0] INTR_BASE = 'h20, // interrupt address base (concat) |
parameter integer INTR_SPAN = 2 // interrupt address span (2^n) |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire [THREADS-1:0] clr_req_i, // clear request, active high |
output wire [THREADS-1:0] clr_ack_o, // clear ack, active high until serviced |
input wire [THREADS-1:0] intr_en_i, // interrupt enable, active high |
input wire [THREADS-1:0] intr_req_i, // interrupt request, active high |
output wire [THREADS-1:0] intr_ack_o, // interrupt ack, active high until serviced |
input wire [MEM_DATA_W-1:0] op_code_i, // opcode |
output wire op_code_er_o, // 1=illegal op code encountered |
// ALU I/O |
input wire [ADDR_W-1:0] b_addr_i, // b | im |
output wire [IM_W-1:0] im_o, // immediate |
output wire [STK_W-1:0] data_sel_a_o, // stack selector |
output wire [STK_W-1:0] data_sel_b_o, // stack selector |
output wire [STK_W-1:0] addr_sel_b_o, // b stack selector |
output wire imda_o, // 1=immediate data |
output wire imad_o, // 1=immediate address |
output wire sgn_o, // 1=signed |
output wire ext_o, // 1=extended |
output wire hgh_o, // 1=high |
output wire [LG_SEL_W-1:0] lg_sel_o, // see decode in notes |
output wire add_o, // 1=add |
output wire sub_o, // 1=subtract |
output wire mul_o, // 1=multiply |
output wire shl_o, // 1=shift left |
output wire pow_o, // 1=power of 2 |
output wire rtn_o, // 1=return pc |
output wire lit_o, // 1=literal data |
output wire dm_rd_o, // 1=read |
output wire dm_wr_o, // 1=write |
output wire rg_rd_o, // 1=read |
output wire rg_wr_o, // 1=write |
// stack I/O |
output wire stk_clr_o, // stacks clear |
output wire [STACKS-1:0] pop_o, // stacks pop |
output wire [STACKS-1:0] push_o, // stacks push |
// flags |
input wire flg_nz_2_i, // a != 0 |
input wire flg_lz_2_i, // a < 0 |
input wire flg_ne_2_i, // a != b |
input wire flg_lt_2_i, // a < b |
// threads |
output wire [THRD_W-1:0] thrd_0_o, |
output wire [THRD_W-1:0] thrd_2_o, |
output wire [THRD_W-1:0] thrd_3_o, |
output wire [THRD_W-1:0] thrd_6_o, |
// addresses |
output wire [ADDR_W-1:0] pc_1_o, |
output wire [ADDR_W-1:0] pc_3_o, |
output wire [ADDR_W-1:0] pc_4_o |
); |
|
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
localparam integer TST_W = 4; |
// |
wire pc_clr, cnd, zro, jmp, gto, intr, res_tst_3; |
wire stk_clr; |
wire [STACKS-1:0] pop, push; |
wire [TST_W-1:0] tst; |
wire thrd_clr, thrd_intr; |
wire [THRD_W-1:0] thrd_4, thrd_5; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// establish threads |
thread_ring |
#( |
.THREADS ( THREADS ), |
.THRD_W ( THRD_W ) |
) |
thread_ring |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.thrd_0_o ( thrd_0_o ), |
.thrd_1_o ( ), |
.thrd_2_o ( thrd_2_o ), |
.thrd_3_o ( thrd_3_o ), |
.thrd_4_o ( thrd_4 ), |
.thrd_5_o ( thrd_5 ), |
.thrd_6_o ( thrd_6_o ), |
.thrd_7_o ( ) |
); |
|
|
// handle external thread clear requests |
event_ctrl |
#( |
.REGS_REQ ( 0 ), // don't resync |
.EDGE_REQ ( 1 ), // edge sensitive |
.RESET_VAL ( { THREADS{ 1'b1 } } ), // clear threads @ power-up |
.THREADS ( THREADS ), |
.THRD_W ( THRD_W ) |
) |
clr_event_ctrl |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.thrd_i ( thrd_5 ), |
.en_i ( { THREADS{ 1'b1 } } ), // always enable |
.req_i ( clr_req_i ), |
.ack_o ( clr_ack_o ), |
.event_o ( thrd_clr ) |
); |
|
|
// handle external thread interrupt requests |
event_ctrl |
#( |
.REGS_REQ ( 2 ), // resync |
.EDGE_REQ ( 1 ), // edge sensitive |
.RESET_VAL ( 0 ), |
.THREADS ( THREADS ), |
.THRD_W ( THRD_W ) |
) |
intr_event_ctrl |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.thrd_i ( thrd_5 ), |
.en_i ( intr_en_i ), |
.req_i ( intr_req_i ), |
.ack_o ( intr_ack_o ), |
.event_o ( thrd_intr ) |
); |
|
|
// conditional jump etc. testing |
tst_decode |
#( |
.REGS_TST ( 2 ), |
.REGS_OUT ( 1 ), |
.TST_W ( TST_W ) |
) |
tst_decode |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.flg_nz_i ( flg_nz_2_i ), |
.flg_lz_i ( flg_lz_2_i ), |
.flg_ne_i ( flg_ne_2_i ), |
.flg_lt_i ( flg_lt_2_i ), |
.cnd_i ( cnd ), |
.tst_i ( tst ), |
.result_o ( res_tst_3 ) |
); |
|
|
// op_code decoding |
op_decode |
#( |
.REGS_IN ( 0 ), |
.REGS_OUT ( 1 ), |
.STACKS ( STACKS ), |
.STK_W ( STK_W ), |
.DATA_W ( DATA_W ), |
.IM_W ( IM_W ), |
.MEM_DATA_W ( MEM_DATA_W ), |
.LG_SEL_W ( LG_SEL_W ), |
.TST_W ( TST_W ) |
) |
op_decode |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.thrd_clr_i ( thrd_clr ), |
.thrd_intr_i ( thrd_intr ), |
.op_code_i ( op_code_i ), |
.op_code_er_o ( op_code_er_o ), |
.im_o ( im_o ), |
.pc_clr_o ( pc_clr ), |
.cnd_o ( cnd ), |
.lit_o ( lit_o ), |
.jmp_o ( jmp ), |
.gto_o ( gto ), |
.intr_o ( intr ), |
.tst_o ( tst ), |
.stk_clr_o ( stk_clr_o ), |
.pop_o ( pop_o ), |
.push_o ( push_o ), |
.data_sel_a_o ( data_sel_a_o ), |
.data_sel_b_o ( data_sel_b_o ), |
.addr_sel_b_o ( addr_sel_b_o ), |
.imda_o ( imda_o ), |
.imad_o ( imad_o ), |
.sgn_o ( sgn_o ), |
.ext_o ( ext_o ), |
.hgh_o ( hgh_o ), |
.lg_sel_o ( lg_sel_o ), |
.add_o ( add_o ), |
.sub_o ( sub_o ), |
.mul_o ( mul_o ), |
.shl_o ( shl_o ), |
.pow_o ( pow_o ), |
.rtn_o ( rtn_o ), |
.dm_rd_o ( dm_rd_o ), |
.dm_wr_o ( dm_wr_o ), |
.rg_rd_o ( rg_rd_o ), |
.rg_wr_o ( rg_wr_o ) |
); |
|
|
// pc generation & storage |
pc_ring |
#( |
.THREADS ( THREADS ), |
.THRD_W ( THRD_W ), |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.CLR_BASE ( CLR_BASE ), |
.CLR_SPAN ( CLR_SPAN ), |
.INTR_BASE ( INTR_BASE ), |
.INTR_SPAN ( INTR_SPAN ) |
) |
pc_ring |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.thrd_0_i ( thrd_0_o ), |
.thrd_4_i ( thrd_4 ), |
.clr_i ( pc_clr ), |
.lit_i ( lit_o ), |
.jmp_i ( jmp ), |
.gto_i ( gto ), |
.intr_i ( intr ), |
.res_tst_3_i ( res_tst_3 ), |
.b_addr_i ( b_addr_i ), |
.pc_0_o ( ), |
.pc_1_o ( pc_1_o ), |
.pc_2_o ( ), |
.pc_3_o ( pc_3_o ), |
.pc_4_o ( pc_4_o ), |
.pc_5_o ( ), |
.pc_6_o ( ), |
.pc_7_o ( ) |
); |
|
|
endmodule |
/trunk/v04.05/alu_top.v
0,0 → 1,215
/* |
-------------------------------------------------------------------------------- |
|
Module : alu_top.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Processor ALU top level. |
|
Instantiates: |
- (2x) pipe.v |
- (1x) alu_logical.v |
- (4x) pipe.v |
- (1x) alu_add_sub.v |
- (4x) pipe.v |
- (1x) alu_mult_shift.v |
- (3x) pipe.v |
- (1x) alu_multiply.v |
- (1x) pipe.v (debug mode only) |
- (1x) alu_mux.v |
- (4x) pipe.v |
|
Notes: |
- I/O registered. |
- Multi-stage pipeline w/ 5 mid registers. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module alu_top |
#( |
parameter integer DATA_W = 32, // data width |
parameter integer ADDR_W = 16, // address width |
parameter integer LG_SEL_W = 4 // operation width |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire sgn_i, // 1=signed |
input wire ext_i, // 1=extended result |
input wire hgh_i, // 1=high |
input wire [LG_SEL_W-1:0] lg_sel_i, // logic operation (see lg_sel_encode.h) |
input wire add_i, // 1=add |
input wire sub_i, // 1=subtract |
input wire mul_i, // 1=multiply |
input wire shl_i, // 1=shift left |
input wire pow_i, // 1=power of 2 |
input wire rtn_i, // 1=return pc |
input wire dm_rd_i, // 1=read |
input wire rg_rd_i, // 1=read |
// data I/O |
input wire [DATA_W-1:0] a_i, // operand |
input wire [DATA_W-1:0] b_i, // operand |
input wire [DATA_W/2-1:0] dm_rd_data_4_i, // dmem read data |
input wire [DATA_W/2-1:0] rg_rd_data_4_i, // regs read data |
input wire [ADDR_W-1:0] pc_3_i, // program counter |
output wire [DATA_W-1:0] result_6_o, // result |
// flags |
output wire flg_nz_2_o, // a != 0 |
output wire flg_lz_2_o, // a < 0 |
output wire flg_ne_2_o, // a != b |
output wire flg_lt_2_o // a < b |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
wire rg_rd_1, dm_rd_1, rtn_1, pow_1, shl_1, mul_1, sub_1, add_1, hgh_1, ext_1, sgn_1; |
wire [LG_SEL_W-1:0] lg_sel_1; |
wire [DATA_W-1:0] a_1, b_1; |
wire [DATA_W-1:0] res_lg_2, res_as_2, res_ms_5; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// input ctrl regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( 11+LG_SEL_W ), |
.RESET_VAL ( 0 ) |
) |
in_regs_ctrl |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { rg_rd_i, dm_rd_i, rtn_i, pow_i, shl_i, mul_i, sub_i, add_i, hgh_i, ext_i, sgn_i, lg_sel_i } ), |
.data_o ( { rg_rd_1, dm_rd_1, rtn_1, pow_1, shl_1, mul_1, sub_1, add_1, hgh_1, ext_1, sgn_1, lg_sel_1 } ) |
); |
|
|
// input data regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( DATA_W+DATA_W ), |
.RESET_VAL ( 0 ) |
) |
in_regs_data |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { b_i, a_i } ), |
.data_o ( { b_1, a_1 } ) |
); |
|
|
// logical unit |
alu_logical |
#( |
.REGS_IN ( 0 ), |
.REGS_MID ( 1 ), |
.REGS_OUT ( 0 ), |
.REGS_FLG ( 1 ), |
.DATA_W ( DATA_W ), |
.LG_SEL_W ( LG_SEL_W ) |
) |
alu_logical |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.lg_sel_i ( lg_sel_1 ), |
.a_i ( a_1 ), |
.b_i ( b_1 ), |
.result_o ( res_lg_2 ), |
.flg_nz_o ( flg_nz_2_o ), |
.flg_lz_o ( flg_lz_2_o ) |
); |
|
|
// add & subtract unit |
alu_add_sub |
#( |
.REGS_IN ( 0 ), |
.REGS_MID ( 1 ), |
.REGS_OUT ( 0 ), |
.REGS_FLG ( 1 ), |
.DATA_W ( DATA_W ) |
) |
alu_add_sub |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.sgn_i ( sgn_1 ), |
.ext_i ( ext_1 ), |
.sub_i ( sub_1 ), |
.a_i ( a_1 ), |
.b_i ( b_1 ), |
.result_o ( res_as_2 ), |
.flg_ne_o ( flg_ne_2_o ), |
.flg_lt_o ( flg_lt_2_o ) |
); |
|
|
// multiply & shift unit |
alu_mult_shift |
#( |
.REGS_IN ( 0 ), |
.REGS_OUT ( 0 ), |
.DATA_W ( DATA_W ), |
.DEBUG_MODE ( 0 ) |
) |
alu_mult_shift |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.sgn_i ( sgn_1 ), |
.ext_i ( ext_1 ), |
.shl_i ( shl_1 ), |
.pow_i ( pow_1 ), |
.a_i ( a_1 ), |
.b_i ( b_1 ), |
.result_o ( res_ms_5 ) |
); |
|
|
// multiplexer |
alu_mux |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ) |
) |
alu_mux |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.sgn_1_i ( sgn_1 ), |
.hgh_1_i ( hgh_1 ), |
.as_1_i ( add_1 | sub_1 ), |
.ms_1_i ( mul_1 | shl_1 | pow_1 ), |
.rtn_1_i ( rtn_1 ), |
.dm_rd_1_i ( dm_rd_1 ), |
.rg_rd_1_i ( rg_rd_1 ), |
.res_lg_2_i ( res_lg_2 ), |
.res_as_2_i ( res_as_2 ), |
.pc_3_i ( pc_3_i ), |
.dm_rd_data_4_i ( dm_rd_data_4_i ), |
.rg_rd_data_4_i ( rg_rd_data_4_i ), |
.res_ms_5_i ( res_ms_5 ), |
.data_6_o ( result_6_o ) |
); |
|
|
endmodule |
/trunk/v04.05/reg_set_addr.h
0,0 → 1,16
// `ifndef _reg_set_addr_h_ |
// `define _reg_set_addr_h_ |
|
// internal register addresses |
localparam integer VER_ADDR = 'h0; |
localparam integer THRD_ID_ADDR = 'h1; |
localparam integer CLR_ADDR = 'h2; |
localparam integer INTR_EN_ADDR = 'h3; |
localparam integer OP_ER_ADDR = 'h4; |
localparam integer STK_ER_ADDR = 'h5; |
localparam integer IO_LO_ADDR = 'h8; |
localparam integer IO_HI_ADDR = 'h9; |
localparam integer UART_RX_ADDR = 'hc; |
localparam integer UART_TX_ADDR = 'hd; |
|
// `endif // _reg_set_addr_h_ |
/trunk/v04.05/lg_sel_encode.h
0,0 → 1,16
`ifndef _lg_sel_encode_h_ |
`define _lg_sel_encode_h_ |
|
`define lg_cpy 4'h0 |
`define lg_nsg 4'h1 |
`define lg_not 4'h2 |
`define lg_flp 4'h4 |
`define lg_lzc 4'h5 |
`define lg_bra 4'h8 |
`define lg_bro 4'h9 |
`define lg_brx 4'ha |
`define lg_and 4'hc |
`define lg_orr 4'hd |
`define lg_xor 4'he |
|
`endif // _lg_sel_encode_h_ |
/trunk/v04.05/reg_base.v
0,0 → 1,242
/* |
-------------------------------------------------------------------------------- |
|
Module: reg_base.v |
|
Function: |
- Single base processor register w/ multiple type & input options (synchronous). |
|
Instantiates: |
- Nothing. |
|
Notes: |
- Init value for each latched bit. |
- LIVE_MASK[i]=1 indicates live bit. |
- LIVE_MASK[i]=0 indicates dead bit, reads zero. |
- Optional resync (2x registering) of inputs. |
- Optional edge detection (rising) of inputs. |
- rd_data_o is driven non-zero if there is an address match, regardless of |
state of rd_i. |
- Use large OR gate to combine multiple register set read data. |
|
OUT_MODE: |
- "ZERO" : zero out |
- "THRU" : no latch, direct connect |
- "LTCH" : write latch |
- "LOOP" : no latch, output selected read data |
|
READ_MODE: |
- "THRU" : no latch, direct connect |
- "CORD" : set on input one, clear on read |
- "COW1" : set on input one, clear on write one |
- "DFFE" : D type flip flop with enable |
- "LOOP" : no latch, read selected output data |
|
-------------------------------------------------------------------------------- |
*/ |
|
|
module reg_base |
#( |
parameter integer DATA_W = 8, // data width (bits) |
parameter integer ADDR_W = 4, // address width (bits) |
parameter [ADDR_W-1:0] ADDRESS = 0, // address this register responds to |
parameter OUT_MODE = "LOOP", // modes are: "ZERO", "THRU", "LTCH", "LOOP" |
parameter READ_MODE = "COW1", // modes are: "THRU", "CORD", "COW1", "DFFE", "LOOP" |
parameter [DATA_W-1:0] LIVE_MASK = { DATA_W{ 1'b1 } }, // 1=live data bit, 0=dead (0) |
parameter IN_RESYNC = 0, // 1=resync (double clock) input, 0=no resync |
parameter IN_EDGE = 0, // 1=edge (rising) sensitive, 0=level sensitive |
parameter [DATA_W-1:0] RESET_VAL = 0 // reset value of latched data |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// bus interface |
input wire [ADDR_W-1:0] addr_i, // address |
input wire wr_i, // data write enable, active high |
input wire rd_i, // data read enable, active high |
input wire [DATA_W-1:0] wr_data_i, // write data |
output wire [DATA_W-1:0] rd_data_o, // read data |
// register interface |
output wire reg_wr_o, // reg write active, active high |
output wire reg_rd_o, // reg read active, active high |
input wire reg_en_i, // reg enable, active high ("DFFE" mode only) |
input wire [DATA_W-1:0] reg_data_i, // reg data in |
output wire [DATA_W-1:0] reg_data_o // reg data out |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
wire addr_match; |
genvar i; |
wire [DATA_W-1:0] in_data, out_data, rd_data; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// check for address match |
assign addr_match = ( addr_i == ADDRESS[ADDR_W-1:0] ); |
|
// decode read & write |
assign reg_rd_o = ( rd_i & addr_match ); |
assign reg_wr_o = ( wr_i & addr_match ); |
|
|
// generate output logic based on mode |
generate |
for ( i=0; i<DATA_W; i=i+1 ) begin : output_loop |
if ( LIVE_MASK[i] ) begin // live bit |
case ( OUT_MODE ) |
"ZERO" : begin |
assign out_data[i] = 1'b0; |
end |
"THRU" : begin |
assign out_data[i] = wr_data_i[i]; |
end |
"LTCH" : begin |
reg reg_bit; |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
reg_bit <= RESET_VAL[i]; |
end else begin |
if ( reg_wr_o ) begin |
reg_bit <= wr_data_i[i]; |
end |
end |
end |
assign out_data[i] = reg_bit; |
end |
"LOOP" : begin |
assign out_data[i] = rd_data[i]; |
end |
default : begin // unknown mode! |
initial $display ( "OUT_MODE %s does not exist!", OUT_MODE ); |
end |
endcase |
end else begin // dead bit |
assign out_data[i] = 1'b0; |
end |
end |
endgenerate |
|
|
// generate optional input resync & edge detect logic |
generate |
for ( i=0; i<DATA_W; i=i+1 ) begin : input_processing_loop |
if ( LIVE_MASK[i] ) begin // live bit |
wire in_2; |
if ( IN_RESYNC ) begin |
reg in_0, in_1; |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
in_0 <= 1'b0; |
in_1 <= 1'b0; |
end else begin |
in_0 <= reg_data_i[i]; |
in_1 <= in_0; |
end |
end |
assign in_2 = in_1; |
end else begin |
assign in_2 = reg_data_i[i]; |
end |
// |
if ( IN_EDGE ) begin |
reg in_3; |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
in_3 <= 1'b0; |
end else begin |
in_3 <= in_2; |
end |
end |
assign in_data[i] = ( in_2 & ~in_3 ); |
end else begin |
assign in_data[i] = in_2; |
end |
end else begin // dead bit |
assign in_data[i] = 1'b0; |
end // endif |
end // endfor |
endgenerate |
|
|
// generate read logic based on mode |
generate |
for ( i=0; i<DATA_W; i=i+1 ) begin : read_loop |
if ( LIVE_MASK[i] ) begin // live bit |
case ( READ_MODE ) |
"THRU" : begin |
assign rd_data[i] = in_data[i]; |
end |
"CORD" : begin |
reg reg_bit; |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
reg_bit <= RESET_VAL[i]; |
end else begin |
if ( reg_rd_o ) begin |
reg_bit <= 1'b0; |
end else begin |
reg_bit <= reg_bit | in_data[i]; |
end |
end |
end |
assign rd_data[i] = reg_bit; |
end |
"COW1" : begin |
reg reg_bit; |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
reg_bit <= RESET_VAL[i]; |
end else begin |
if ( reg_wr_o ) begin |
reg_bit <= reg_bit & ~wr_data_i[i]; |
end else begin |
reg_bit <= reg_bit | in_data[i]; |
end |
end |
end |
assign rd_data[i] = reg_bit; |
end |
"DFFE" : begin |
reg reg_bit; |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
reg_bit <= RESET_VAL[i]; |
end else if ( reg_en_i ) begin |
reg_bit <= in_data[i]; |
end |
end |
assign rd_data[i] = reg_bit; |
end |
"LOOP" : begin |
assign rd_data[i] = out_data[i]; |
end |
default : begin // unknown mode! |
initial $display ( "RD_MODE %s does not exist!", RD_MODE ); |
end |
endcase |
end else begin // dead bit |
assign rd_data[i] = 1'b0; |
end |
end |
endgenerate |
|
|
// drive outputs |
assign rd_data_o = ( addr_match ) ? rd_data : 1'b0; |
assign reg_data_o = out_data; |
|
|
endmodule |
/trunk/v04.05/ep4ce6e22c8_demo_board.cof
0,0 → 1,20
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?> |
<cof> |
<eprom_name>EPCS16</eprom_name> |
<flash_loader_device>EP4CE6</flash_loader_device> |
<output_filename>output_file.jic</output_filename> |
<n_pages>1</n_pages> |
<width>1</width> |
<mode>7</mode> |
<sof_data> |
<user_name>Page_0</user_name> |
<page_flags>1</page_flags> |
<bit0> |
<sof_filename>ep4ce6e22c8_demo_board.sof</sof_filename> |
</bit0> |
</sof_data> |
<version>4</version> |
<options> |
<map_file>1</map_file> |
</options> |
</cof> |
/trunk/v04.05/alu_mux.v
0,0 → 1,189
/* |
-------------------------------------------------------------------------------- |
|
Module : alu_mux.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Multiplexer for processor ALU. |
|
Instantiates: |
- (5x) pipe.v |
|
Notes: |
- Inputs at stage 1, outputs at stage 6. |
- Default behavior is pass-thru. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module alu_mux |
#( |
parameter integer DATA_W = 8, // data width |
parameter integer ADDR_W = 4 // address width |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire sgn_1_i, // 1=signed |
input wire hgh_1_i, // 1=high |
input wire as_1_i, // 1=add/subtract |
input wire ms_1_i, // 1=multiply/shift |
input wire rtn_1_i, // 1=return pc |
input wire dm_rd_1_i, // 1=read |
input wire rg_rd_1_i, // 1=read |
// data I/O |
input wire [DATA_W-1:0] res_lg_2_i, // logical result |
input wire [DATA_W-1:0] res_as_2_i, // add/subtract result |
input wire [ADDR_W-1:0] pc_3_i, // program counter |
input wire [DATA_W/2-1:0] dm_rd_data_4_i, // dmem read data |
input wire [DATA_W/2-1:0] rg_rd_data_4_i, // regs read data |
input wire [DATA_W-1:0] res_ms_5_i, // multiply/shift result |
output wire [DATA_W-1:0] data_6_o // data out |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
wire as_2, rtn_2, sgn_2, rg_rd_2, dm_rd_2, hgh_2, ms_2; |
wire rtn_3, sgn_3, rg_rd_3, dm_rd_3, hgh_3, ms_3; |
wire sgn_4, rg_rd_4, dm_rd_4, hgh_4, ms_4; |
wire ms_5; |
wire [DATA_W-1:0] data_3, data_4, data_5; |
reg [DATA_W-1:0] mux_2, mux_3, mux_4, mux_5; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// 1 to 2 regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( 7 ), |
.RESET_VAL ( 0 ) |
) |
regs_1_2 |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { as_1_i, rtn_1_i, sgn_1_i, rg_rd_1_i, dm_rd_1_i, hgh_1_i, ms_1_i } ), |
.data_o ( { as_2, rtn_2, sgn_2, rg_rd_2, dm_rd_2, hgh_2, ms_2 } ) |
); |
|
|
// mux 2 |
always @ ( * ) begin |
casex ( as_2 ) |
'b1 : mux_2 <= res_as_2_i; |
default : mux_2 <= res_lg_2_i; // default is thru |
endcase |
end |
|
|
// 2 to 3 regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( 6+DATA_W ), |
.RESET_VAL ( 0 ) |
) |
regs_2_3 |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { rtn_2, sgn_2, rg_rd_2, dm_rd_2, hgh_2, ms_2, mux_2 } ), |
.data_o ( { rtn_3, sgn_3, rg_rd_3, dm_rd_3, hgh_3, ms_3, data_3 } ) |
); |
|
|
// mux 3 |
always @ ( * ) begin |
casex ( rtn_3 ) |
'b1 : mux_3 <= pc_3_i; // unsigned |
default : mux_3 <= data_3; // default is thru |
endcase |
end |
|
|
// 3 to 4 regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( 5+DATA_W ), |
.RESET_VAL ( 0 ) |
) |
regs_3_4 |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { sgn_3, rg_rd_3, dm_rd_3, hgh_3, ms_3, mux_3 } ), |
.data_o ( { sgn_4, rg_rd_4, dm_rd_4, hgh_4, ms_4, data_4 } ) |
); |
|
|
// mux 4 |
always @ ( * ) begin |
casex ( { rg_rd_4, dm_rd_4, hgh_4, sgn_4 } ) |
'b0100 : mux_4 <= dm_rd_data_4_i; |
'b0101 : mux_4 <= $signed( dm_rd_data_4_i ); |
'b011x : mux_4 <= { dm_rd_data_4_i, data_4[DATA_W/2-1:0] }; |
'b1x0x : mux_4 <= $signed( rg_rd_data_4_i ); |
'b1x1x : mux_4 <= { rg_rd_data_4_i, data_4[DATA_W/2-1:0] }; |
default : mux_4 <= data_4; // default is thru |
endcase |
end |
|
|
// 4 to 5 regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( 1+DATA_W ), |
.RESET_VAL ( 0 ) |
) |
regs_4_5 |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { ms_4, mux_4 } ), |
.data_o ( { ms_5, data_5 } ) |
); |
|
|
// mux 5 |
always @ ( * ) begin |
casex ( ms_5 ) |
'b1 : mux_5 <= res_ms_5_i; |
default : mux_5 <= data_5; // default is thru |
endcase |
end |
|
|
// 5 to 6 regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( DATA_W ), |
.RESET_VAL ( 0 ) |
) |
d_out_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( mux_5 ), |
.data_o ( data_6_o ) |
); |
|
|
endmodule |
/trunk/v04.05/alu_logical.v
0,0 → 1,181
/* |
-------------------------------------------------------------------------------- |
|
Module : alu_logical.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Logic unit for a processor ALU. |
|
Instantiates: |
- (4x) pipe.v |
- (1x) lg_sel_encode.h |
|
Notes: |
- IN/MID/OUT/FLG optionally registered. |
- Default path through is copy. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module alu_logical |
#( |
parameter integer REGS_IN = 1, // register option for inputs |
parameter integer REGS_MID = 1, // mid register option |
parameter integer REGS_OUT = 1, // register option for outputs |
parameter integer REGS_FLG = 1, // register option for flag outputs |
parameter integer DATA_W = 32, // data width |
parameter integer LG_SEL_W = 4 // operation width |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire [LG_SEL_W-1:0] lg_sel_i, // operation (see lg_sel_encode.h) |
// data I/O |
input wire [DATA_W-1:0] a_i, // operand |
input wire [DATA_W-1:0] b_i, // operand |
output wire [DATA_W-1:0] result_o, // logical result |
// flags |
output wire flg_nz_o, // a != 0 |
output wire flg_lz_o // a < 0 |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
`include "lg_sel_encode.h" |
`include "functions.h" // for clog2(), flip_32(), lzc_32() |
localparam integer LZC_W = clog2( DATA_W ) + 1; |
// |
wire [LG_SEL_W-1:0] lg_sel, lg_sel_m; |
wire [DATA_W-1:0] a, b; |
reg [DATA_W-1:0] res_1op, res_2op; |
wire [DATA_W-1:0] res_1op_m, res_2op_m; |
reg res_br; |
wire res_br_m; |
reg [DATA_W-1:0] result; |
wire flg_nz, flg_lz; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// optional input registers |
pipe |
#( |
.DEPTH ( REGS_IN ), |
.WIDTH ( LG_SEL_W+DATA_W+DATA_W ), |
.RESET_VAL ( 0 ) |
) |
in_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { lg_sel_i, b_i, a_i, } ), |
.data_o ( { lg_sel, b, a } ) |
); |
|
|
// flags |
assign flg_nz = |a; |
assign flg_lz = a[DATA_W-1]; |
|
// multiplex one operand results |
always @ ( * ) begin |
case ( lg_sel ) |
`lg_nsg : res_1op <= { ~b[DATA_W-1], b[DATA_W-2:0] }; |
`lg_not : res_1op <= ~b; |
`lg_flp : res_1op <= flip_32( b ); |
`lg_lzc : res_1op <= lzc_32( b ); |
default : res_1op <= b; // default is copy |
endcase |
end |
|
// multiplex one operand bit reduction results |
always @ ( * ) begin |
case ( lg_sel ) |
`lg_bro : res_br <= |b; |
`lg_brx : res_br <= ^b; |
default : res_br <= &b; |
endcase |
end |
|
// multiplex two operand results |
always @ ( * ) begin |
case ( lg_sel ) |
`lg_orr : res_2op <= a | b; |
`lg_xor : res_2op <= a ^ b; |
default : res_2op <= a & b; |
endcase |
end |
|
|
// optional flag regs |
pipe |
#( |
.DEPTH ( REGS_FLG ), |
.WIDTH ( 2 ), |
.RESET_VAL ( 0 ) |
) |
regs_flags |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { flg_nz, flg_lz, } ), |
.data_o ( { flg_nz_o, flg_lz_o } ) |
); |
|
|
// optional mid regs |
pipe |
#( |
.DEPTH ( REGS_MID ), |
.WIDTH ( LG_SEL_W+1+DATA_W+DATA_W ), |
.RESET_VAL ( 0 ) |
) |
mid_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { lg_sel, res_br, res_2op, res_1op } ), |
.data_o ( { lg_sel_m, res_br_m, res_2op_m, res_1op_m } ) |
); |
|
|
// multiplex |
always @ ( * ) begin |
case ( lg_sel_m ) |
`lg_bra, `lg_bro, `lg_brx : result <= { DATA_W{ res_br_m } }; |
`lg_and, `lg_orr, `lg_xor : result <= res_2op_m; |
default : result <= res_1op_m; // default is copy |
endcase |
end |
|
|
// optional output regs |
pipe |
#( |
.DEPTH ( REGS_OUT ), |
.WIDTH ( DATA_W ), |
.RESET_VAL ( 0 ) |
) |
out_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( result ), |
.data_o ( result_o ) |
); |
|
|
endmodule |
/trunk/v04.05/tst_decode.v
0,0 → 1,118
/* |
-------------------------------------------------------------------------------- |
|
Module : tst_decode.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Processor test decoding for conditional jumps, etc. |
|
Instantiates: |
- (2x) pipe.v |
- (1x) tst_encode.h |
|
Notes: |
- Parameterized register(s) @ test inputs. |
- Parameterized register(s) @ output. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module tst_decode |
#( |
parameter integer REGS_TST = 0, // reg option input to test |
parameter integer REGS_OUT = 0, // reg option test to output |
parameter integer TST_W = 4 // test field width |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// flags (combinatorial) |
input wire flg_nz_i, // a != 0 |
input wire flg_lz_i, // a < 0 |
input wire flg_ne_i, // a != b |
input wire flg_lt_i, // a < b |
// tests (optionally registered) |
input wire cnd_i, // 1=conditional |
input wire [TST_W-1:0] tst_i, // test field (see tst_encode.h) |
// output (optionally registered) |
output wire result_o // 1=true; 0=false |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
`include "tst_encode.h" |
wire cnd, zro; |
wire [TST_W-1:0] tst; |
reg res; |
wire result; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// input to test regs |
pipe |
#( |
.DEPTH ( REGS_TST ), |
.WIDTH ( 1+TST_W ), |
.RESET_VAL ( 0 ) |
) |
tst_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { cnd_i, tst_i } ), |
.data_o ( { cnd, tst } ) |
); |
|
|
// mux |
always @ ( * ) begin |
case ( tst ) |
`z : res <= ~flg_nz_i; |
`nz : res <= flg_nz_i; |
`lz : res <= flg_lz_i; |
`nlz : res <= ~flg_lz_i; |
`e : res <= ~flg_ne_i; |
`ne : res <= flg_ne_i; |
`ls : res <= flg_lt_i; |
`nls : res <= ~flg_lt_i; |
`lu : res <= flg_lt_i; |
`nlu : res <= ~flg_lt_i; |
default : res <= 1'b1; // benign default |
endcase |
end |
|
// output result if conditional, output 1 if not |
assign result = ( cnd ) ? res : 1'b1; |
|
|
// result to output regs |
pipe |
#( |
.DEPTH ( REGS_OUT ), |
.WIDTH ( 1 ), |
.RESET_VAL ( 0 ) |
) |
out_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( result ), |
.data_o ( result_o ) |
); |
|
|
endmodule |
/trunk/v04.05/pc_ring.v
0,0 → 1,202
/* |
-------------------------------------------------------------------------------- |
|
Module : pc_ring.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Processor PC storage ring. |
|
Instantiates: |
- (2x) pipe.v |
|
Notes: |
- 8 stages. |
- Loop feedback, so PC interstage pipe registering forms a storage ring. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module pc_ring |
#( |
parameter integer THREADS = 8, // threads |
parameter integer THRD_W = 3, // thread width |
parameter integer DATA_W = 32, // data width |
parameter integer ADDR_W = 16, // address width |
parameter [ADDR_W-1:0] CLR_BASE = 'h0, // clear address base (concat) |
parameter integer CLR_SPAN = 2, // clear address span (2^n) |
parameter [ADDR_W-1:0] INTR_BASE = 'h20, // interrupt address base (concat) |
parameter integer INTR_SPAN = 2 // interrupt address span (2^n) |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire [THRD_W-1:0] thrd_0_i, // thread |
input wire [THRD_W-1:0] thrd_4_i, // thread |
input wire clr_i, // 1=pc clear |
input wire lit_i, // 1 : pc=pc++ for literal data |
input wire jmp_i, // 1 : pc=pc+B|I for jump (cond) |
input wire gto_i, // 1 : pc=B for goto | gosub (cond) |
input wire intr_i, // 1 : pc=int |
input wire res_tst_3_i, // 1=true (or disabled); 0=false |
// address I/O |
input wire [ADDR_W-1:0] b_addr_i, // b | im |
output wire [ADDR_W-1:0] pc_0_o, |
output wire [ADDR_W-1:0] pc_1_o, |
output wire [ADDR_W-1:0] pc_2_o, |
output wire [ADDR_W-1:0] pc_3_o, |
output wire [ADDR_W-1:0] pc_4_o, |
output wire [ADDR_W-1:0] pc_5_o, |
output wire [ADDR_W-1:0] pc_6_o, |
output wire [ADDR_W-1:0] pc_7_o |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
reg [ADDR_W-1:0] pc[0:THREADS-1]; |
// |
wire [ADDR_W-1:0] clr_addr_0, intr_addr_4; |
wire intr_2, gto_2, jmp_2, lit_2; |
wire intr_3, gto_3, jmp_3; |
wire intr_4; |
wire signed [ADDR_W-1:0] b_addr_2, b_addr_3; |
reg [ADDR_W-1:0] mux_0, mux_2, mux_3, mux_4; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
// form the clear address |
assign clr_addr_0[ADDR_W-1:THRD_W+CLR_SPAN] = CLR_BASE[ADDR_W-1:THRD_W+CLR_SPAN]; |
assign clr_addr_0[THRD_W+CLR_SPAN-1:0] = thrd_0_i << CLR_SPAN; |
|
// mux for clear, next instruction |
always @ ( * ) begin |
casex ( { clr_i, intr_i } ) |
'b01 : mux_0 <= pc[0]; // no change for int |
'b1x : mux_0 <= clr_addr_0; // clear |
default : mux_0 <= pc[0] + 1'b1; // inc for next |
endcase |
end |
|
|
// 0 to 2 regs |
pipe |
#( |
.DEPTH ( 2 ), |
.WIDTH ( 4+ADDR_W ), |
.RESET_VAL ( 0 ) |
) |
regs_0_2 |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { lit_i, jmp_i, gto_i, intr_i, b_addr_i } ), |
.data_o ( { lit_2, jmp_2, gto_2, intr_2, b_addr_2 } ) |
); |
|
|
// mux for literal data |
always @ ( * ) begin |
casex ( lit_2 ) |
'b1 : mux_2 <= pc[2] + 1'b1; // literal data |
default : mux_2 <= pc[2]; // no change |
endcase |
end |
|
|
// 2 to 3 regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( 3+ADDR_W ), |
.RESET_VAL ( 0 ) |
) |
regs_2_3 |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { jmp_2, gto_2, intr_2, b_addr_2 } ), |
.data_o ( { jmp_3, gto_3, intr_3, b_addr_3 } ) |
); |
|
|
// mux for jmp, gto, gsb |
always @ ( * ) begin |
casex ( { res_tst_3_i, gto_3, jmp_3 } ) |
'b101 : mux_3 <= pc[3] + b_addr_3; // jmp | jmp_i |
'b11x : mux_3 <= b_addr_3; // gto | gsb |
default : mux_3 <= pc[3]; // no change |
endcase |
end |
|
|
// 3 to 4 regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( 1 ), |
.RESET_VAL ( 0 ) |
) |
regs_3_4 |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( intr_3 ), |
.data_o ( intr_4 ) |
); |
|
|
// form the interrupt address |
assign intr_addr_4[ADDR_W-1:THRD_W+INTR_SPAN] = INTR_BASE[ADDR_W-1:THRD_W+INTR_SPAN]; |
assign intr_addr_4[THRD_W+INTR_SPAN-1:0] = thrd_4_i << INTR_SPAN; |
|
// mux for interrupt |
always @ ( * ) begin |
casex ( intr_4 ) |
'b1 : mux_4 <= intr_addr_4; // interrupt |
default : mux_4 <= pc[4]; // no change |
endcase |
end |
|
// pc storage ring |
integer j; |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
for ( j = 0; j < THREADS; j = j + 1 ) begin |
pc[j] <= 'b0; |
end |
end else begin |
for ( j = 0; j < THREADS; j = j + 1 ) begin |
if ( j == 0 ) pc[j] <= pc[THREADS-1]; // wrap around |
else if ( j == 1 ) pc[j] <= mux_0; |
else if ( j == 3 ) pc[j] <= mux_2; |
else if ( j == 4 ) pc[j] <= mux_3; |
else if ( j == 5 ) pc[j] <= mux_4; |
else pc[j] <= pc[j-1]; |
end |
end |
end |
|
// output pc |
assign pc_0_o = pc[0]; |
assign pc_1_o = pc[1]; |
assign pc_2_o = pc[2]; |
assign pc_3_o = pc[3]; |
assign pc_4_o = mux_4; // note: async! |
assign pc_5_o = pc[5]; |
assign pc_6_o = pc[6]; |
assign pc_7_o = pc[7]; |
|
|
endmodule |
/trunk/v04.05/op_decode.v
0,0 → 1,683
/* |
-------------------------------------------------------------------------------- |
|
Module : op_decode.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Opcode decoder for processor. |
|
Instantiates: |
- (2x) pipe.v |
- (1x) op_encode.h |
|
Notes: |
- I/O optionally registered. |
- Middle register is always present. |
- Operates on the current thread in the stage. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module op_decode |
#( |
parameter integer REGS_IN = 1, // register option for inputs |
parameter integer REGS_OUT = 1, // register option for outputs |
parameter integer STACKS = 8, // number of stacks |
parameter integer STK_W = 3, // stack selector width |
parameter integer DATA_W = 32, // data width |
parameter integer IM_W = 6, // immediate width |
parameter integer MEM_DATA_W = 16, // op code width |
parameter integer LG_SEL_W = 4, // logical operation width |
parameter integer TST_W = 4 // test field width |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// state I/O |
input wire thrd_clr_i, // thread clear |
input wire thrd_intr_i, // thread interrupt |
input wire [MEM_DATA_W-1:0] op_code_i, // op_code |
output wire op_code_er_o, // 1=illegal op code encountered |
// data I/O |
output wire [IM_W-1:0] im_o, // immediate |
// pc pipe control |
output wire pc_clr_o, // 1 : pc clear |
output wire cnd_o, // 1 : conditional |
output wire lit_o, // 1 : pc=pc++ for literal data |
output wire jmp_o, // 1 : pc=pc+B|I for jump (cond) |
output wire gto_o, // 1 : pc=B for goto / gosub |
output wire intr_o, // 1 : pc=intr |
// conditional masks |
output wire [TST_W-1:0] tst_o, // test field (see tst_encode.h) |
// stacks control |
output wire stk_clr_o, // stacks clear |
output wire [STACKS-1:0] pop_o, // stacks pop |
output wire [STACKS-1:0] push_o, // stacks push |
// alu control |
output wire [STK_W-1:0] data_sel_a_o, // a stack selector |
output wire [STK_W-1:0] data_sel_b_o, // b stack selector |
output wire [STK_W-1:0] addr_sel_b_o, // b stack selector |
output wire imda_o, // 1=immediate data |
output wire imad_o, // 1=immediate address |
output wire sgn_o, // 1=signed |
output wire ext_o, // 1=extended |
output wire hgh_o, // 1=high |
output wire [LG_SEL_W-1:0] lg_sel_o, // logic operation (see lg_sel_encode.h) |
output wire add_o, // 1=add |
output wire sub_o, // 1=subtract |
output wire mul_o, // 1=multiply |
output wire shl_o, // 1=shift left |
output wire pow_o, // 1=power of 2 |
output wire rtn_o, // 1=return pc |
output wire dm_rd_o, // 1=read |
output wire dm_wr_o, // 1=write |
output wire rg_rd_o, // 1=read |
output wire rg_wr_o // 1=write |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
`include "lg_sel_encode.h" |
`include "tst_encode.h" |
`include "op_encode.h" |
// |
wire thrd_clr, thrd_intr; |
wire [MEM_DATA_W-1:0] op_code; |
reg op_ok; |
reg [4:0] op_code_ok; |
wire op_code_er; |
// |
reg [IM_W-1:0] im; |
reg pc_clr; |
reg intr, gto, jmp, lit, cnd; |
reg [TST_W-1:0] tst; |
reg stk_clr; |
reg [4:0] push_a; |
reg [4:0] pop_a, pop_b; |
wire [STACKS-1:0] pop, push; |
reg [STK_W-1:0] data_sel_a, data_sel_b, addr_sel_b; |
reg imda; |
reg imad; |
reg rtn, pow, shl, mul, sub, add, hgh, ext, sgn; |
reg [LG_SEL_W-1:0] lg_sel; |
reg dm_rd, dm_wr, rg_rd, rg_wr; |
reg [STACKS-1:0] pop_all; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// optional input registers |
pipe |
#( |
.DEPTH ( REGS_IN ), |
.WIDTH ( 2+MEM_DATA_W ), |
.RESET_VAL ( 0 ) |
) |
in_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { thrd_clr_i, thrd_intr_i, op_code_i } ), |
.data_o ( { thrd_clr, thrd_intr, op_code } ) |
); |
|
|
// instantiate & split out op_code fields |
wire [2:0] op_code_sa = op_code[2:0]; |
wire op_code_pa = op_code[3]; |
wire [2:0] op_code_sb = op_code[6:4]; |
wire op_code_pb = op_code[7]; |
wire [3:0] op_code_th = op_code[15:12]; |
wire [3:0] op_code_tm = { 2'b00, op_code[11:10] }; |
wire [3:0] op_code_tl = { 2'b00, op_code[9:8] }; |
wire [5:0] op_code_i4 = $signed( op_code[11:8] ); |
wire [5:0] op_code_i6 = op_code[9:4]; |
wire [7:0] op_code_pf = op_code[7:0]; |
// |
reg [2:0] sa_reg, sb_reg; |
|
|
// mid register if & case: clear, interrupt, and op_code decode |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
op_ok <= 'b0; |
op_code_ok <= 'b0; |
pc_clr <= 'b0; |
cnd <= 'b0; |
lit <= 'b0; |
jmp <= 'b0; |
gto <= 'b0; |
intr <= 'b0; |
tst <= 'b0; |
stk_clr <= 'b0; |
pop_all <= 'b0; |
pop_a <= 'b0; |
pop_b <= 'b0; |
push_a <= 'b0; |
data_sel_a <= 'b0; |
data_sel_b <= 'b0; |
addr_sel_b <= 'b0; |
imda <= 'b0; |
imad <= 'b0; |
im <= 'b0; |
sgn <= 'b0; |
ext <= 'b0; |
hgh <= 'b0; |
lg_sel <= `lg_cpy; |
add <= 'b0; |
sub <= 'b0; |
mul <= 'b0; |
shl <= 'b0; |
pow <= 'b0; |
rtn <= 'b0; |
dm_rd <= 'b0; |
dm_wr <= 'b0; |
rg_rd <= 'b0; |
rg_wr <= 'b0; |
sa_reg <= 'b0; |
sb_reg <= 'b0; |
end else begin |
// default values |
op_ok <= 'b0; // default is bad op |
op_code_ok <= 'b0; // default is bad opcode |
pc_clr <= 'b0; // default is no pc clear |
cnd <= 'b0; // default is unconditional |
lit <= 'b0; // default is no follow |
jmp <= 'b0; // default is no jump |
gto <= 'b0; // default is no goto |
intr <= 'b0; // default is no interrupt |
tst <= op_code_tl; // default is low test field |
stk_clr <= 'b0; // default is no stack clear |
pop_all <= 'b0; // default is no pop |
pop_a <= 'b0; // default is no pop |
pop_b <= 'b0; // default is no pop |
push_a <= 'b0; // default is no push |
data_sel_a <= op_code_sa; // default is op_code directive |
data_sel_b <= op_code_sb; // default is op_code directive |
addr_sel_b <= op_code_sb; // default is op_code directive |
imda <= 'b0; // default is not immediate data |
imad <= 'b0; // default is not immediate address |
im <= op_code_i6; // default is full width |
sgn <= 'b0; // default is unsigned |
hgh <= 'b0; // default is not high |
ext <= 'b0; // default is unextended |
lg_sel <= `lg_cpy; // default is thru |
add <= 'b0; // default is thru |
sub <= 'b0; // default is thru |
mul <= 'b0; // default is thru |
shl <= 'b0; // default is thru |
pow <= 'b0; // default is thru |
rtn <= 'b0; // default is thru |
dm_rd <= 'b0; // default is don't read |
dm_wr <= 'b0; // default is don't write |
rg_rd <= 'b0; // default is don't read |
rg_wr <= 'b0; // default is don't write |
sa_reg <= op_code_sa; // default is follow op_code |
sb_reg <= op_code_sb; // default is follow op_code |
if ( thrd_clr ) begin |
op_ok <= 'b1; // good op |
pc_clr <= 'b1; // clear pc |
stk_clr <= 'b1; // clear stacks |
end else if ( thrd_intr ) begin |
op_ok <= 'b1; // good op |
intr <= 'b1; // don't inc PC |
push_a[0] <= 'b1; // push |
data_sel_a <= 'b0; // push return address to stack 0 |
rtn <= 'b1; // push pc |
end else begin |
casex ( op_code ) |
//////////////////// |
// group 0 - misc // |
//////////////////// |
op_nop : begin |
op_code_ok[0] <= 'b1; |
end |
op_pop : begin |
op_code_ok[0] <= 'b1; |
pop_all <= op_code_pf; |
end |
op_pgc : begin |
op_code_ok[0] <= 'b1; |
pop_a[0] <= op_code_pa; |
pop_b[0] <= op_code_pb; |
push_a[0] <= 'b1; // push |
rtn <= 'b1; // push pc |
end |
op_lit_s : begin |
op_code_ok[0] <= 'b1; |
pop_a[0] <= op_code_pa; |
pop_b[0] <= op_code_pb; |
push_a[0] <= 'b1; // push |
lit <= 'b1; // lit |
dm_rd <= 'b1; // dm |
sgn <= 'b1; // signed |
end |
op_lit_h : begin |
op_code_ok[0] <= 'b1; |
pop_a[0] <= op_code_pa; |
pop_b[0] <= op_code_pb; |
push_a[0] <= 'b1; // push |
data_sel_b <= op_code_sa; // route A thru ALU bypass |
lit <= 'b1; // lit |
dm_rd <= 'b1; // dm |
hgh <= 'b1; // high |
end |
op_lit_u : begin |
op_code_ok[0] <= 'b1; |
pop_a[0] <= op_code_pa; |
pop_b[0] <= op_code_pb; |
push_a[0] <= 'b1; // push |
lit <= 'b1; // lit |
dm_rd <= 'b1; // dm |
end |
op_reg_rs : begin |
op_code_ok[0] <= 'b1; |
pop_a[0] <= op_code_pa; |
pop_b[0] <= op_code_pb; |
push_a[0] <= 'b1; // push |
rg_rd <= 'b1; // read |
sgn <= 'b1; // signed |
end |
op_reg_rh : begin |
op_code_ok[0] <= 'b1; |
pop_a[0] <= op_code_pa; |
pop_b[0] <= op_code_pb; |
push_a[0] <= 'b1; // push |
data_sel_b <= op_code_sa; // route A thru ALU bypass |
rg_rd <= 'b1; // read |
hgh <= 'b1; // high |
end |
op_reg_w : begin |
op_code_ok[0] <= 'b1; |
pop_a[0] <= op_code_pa; |
pop_b[0] <= op_code_pb; |
rg_wr <= 'b1; // write |
end |
op_reg_wh : begin |
op_code_ok[0] <= 'b1; |
pop_a[0] <= op_code_pa; |
pop_b[0] <= op_code_pb; |
rg_wr <= 'b1; // write |
hgh <= 'b1; // high |
end |
/////////////////////// |
// group 1 - logical // |
/////////////////////// |
op_cpy : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_cpy; |
end |
op_nsg : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_nsg; |
end |
op_not : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_not; |
end |
op_flp : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_flp; |
end |
op_lzc : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_lzc; |
end |
op_bra : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_bra; |
end |
op_bro : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_bro; |
end |
op_brx : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_brx; |
end |
op_and : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_and; |
end |
op_orr : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_orr; |
end |
op_xor : begin |
op_code_ok[1] <= 'b1; |
pop_a[1] <= op_code_pa; |
pop_b[1] <= op_code_pb; |
push_a[1] <= 'b1; // push |
lg_sel <= `lg_xor; |
end |
////////////////////////// |
// group 2 - arithmetic // |
////////////////////////// |
op_add : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
add <= 'b1; // add |
end |
op_add_xs : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
add <= 'b1; // add |
ext <= 'b1; // extended |
sgn <= 'b1; // signed |
end |
op_add_xu : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
add <= 'b1; // add |
ext <= 'b1; // extended |
end |
op_sub : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
sub <= 'b1; // sub |
end |
op_sub_xs : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
sub <= 'b1; // sub |
ext <= 'b1; // extended |
sgn <= 'b1; // signed |
end |
op_sub_xu : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
sub <= 'b1; // sub |
ext <= 'b1; // extended |
end |
op_mul : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
mul <= 'b1; // multiply |
end |
op_mul_xs : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
mul <= 'b1; // multiply |
ext <= 'b1; // extended |
sgn <= 'b1; // signed |
end |
op_mul_xu : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
mul <= 'b1; // multiply |
ext <= 'b1; // extended |
end |
op_shl_s : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
shl <= 'b1; // shift left |
sgn <= 'b1; // signed |
end |
op_shl_u : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
shl <= 'b1; // shift left |
end |
op_pow : begin |
op_code_ok[2] <= 'b1; |
pop_a[2] <= op_code_pa; |
pop_b[2] <= op_code_pb; |
push_a[2] <= 'b1; // push |
pow <= 'b1; // power of 2 |
end |
//////////////////////// |
// group 3 - branches // |
//////////////////////// |
op_jmp_z, op_jmp_nz, op_jmp_lz, op_jmp_nlz : begin |
op_code_ok[3] <= 'b1; |
pop_a[3] <= op_code_pa; |
pop_b[3] <= op_code_pb; |
jmp <= 'b1; // jump |
cnd <= 'b1; // conditional |
tst <= op_code_tl; // lo test field |
end |
op_jmp : begin |
op_code_ok[3] <= 'b1; |
pop_a[3] <= op_code_pa; |
pop_b[3] <= op_code_pb; |
jmp <= 'b1; // jump |
end |
op_gto : begin |
op_code_ok[3] <= 'b1; |
pop_a[3] <= op_code_pa; |
pop_b[3] <= op_code_pb; |
gto <= 'b1; // goto |
end |
op_gsb : begin |
op_code_ok[3] <= 'b1; |
pop_a[3] <= op_code_pa; |
pop_b[3] <= op_code_pb; |
push_a[3] <= 'b1; // push |
gto <= 'b1; // goto |
rtn <= 'b1; // push pc |
end |
////////////////////////// |
// group 4 - immediates // |
////////////////////////// |
/////////////////////////////////// |
// immediate memory read & write // |
/////////////////////////////////// |
op_mem_irs : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
pop_b[4] <= op_code_pb; |
push_a[4] <= 'b1; // push |
im <= op_code_i4; // small im |
dm_rd <= 'b1; // read |
sgn <= 'b1; // signed |
end |
op_mem_irh : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
pop_b[4] <= op_code_pb; |
push_a[4] <= 'b1; // push |
im <= op_code_i4; // small im |
data_sel_b <= op_code_sa; // route A thru ALU bypass |
dm_rd <= 'b1; // read |
hgh <= 'b1; // high |
end |
op_mem_iw : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
pop_b[4] <= op_code_pb; |
im <= op_code_i4; // small im |
dm_wr <= 'b1; // write |
end |
op_mem_iwh : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
pop_b[4] <= op_code_pb; |
im <= op_code_i4; // small im |
dm_wr <= 'b1; // write |
hgh <= 'b1; // high |
end |
///////////////////////////////// |
// immediate conditional jumps // |
///////////////////////////////// |
op_jmp_ie, op_jmp_ine, op_jmp_ilu, op_jmp_inlu : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
pop_b[4] <= op_code_pb; |
jmp <= 'b1; // jump |
cnd <= 'b1; // conditional |
imad <= 'b1; // immediate address |
im <= op_code_i4; // small im |
tst <= op_code_th; // hi test field |
end |
op_jmp_ils, op_jmp_inls : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
pop_b[4] <= op_code_pb; |
jmp <= 'b1; // jump |
cnd <= 'b1; // conditional |
imad <= 'b1; // immediate address |
im <= op_code_i4; // small im |
tst <= op_code_th; // hi test field |
sgn <= 'b1; // signed |
end |
op_jmp_iz, op_jmp_inz, op_jmp_ilz, op_jmp_inlz : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
jmp <= 'b1; // jump |
cnd <= 'b1; // conditional |
imad <= 'b1; // immediate address |
tst <= op_code_tm; // mid test field |
end |
//////////////////// |
// immediate data // |
//////////////////// |
op_dat_is : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
push_a[4] <= 'b1; // push |
imda <= 'b1; // immediate b data |
sgn <= 'b1; // signed |
end |
/////////////////// |
// immediate add // |
/////////////////// |
op_add_is : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
push_a[4] <= 'b1; // push |
imda <= 'b1; // immediate b data |
add <= 'b1; // add |
sgn <= 'b1; // signed |
end |
////////////////////// |
// immediate shifts // |
////////////////////// |
op_shl_is : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
push_a[4] <= 'b1; // push |
imda <= 'b1; // immediate b data |
shl <= 'b1; // shift left |
sgn <= 'b1; // signed |
end |
op_psu_i : begin |
op_code_ok[4] <= 'b1; |
pop_a[4] <= op_code_pa; |
push_a[4] <= 'b1; // push |
imda <= 'b1; // immediate b data |
shl <= 'b1; // shift left |
pow <= 'b1; // power of 2 |
end |
default: begin |
// nothing here |
end |
endcase |
end |
end |
end |
|
// decode pop & push (note: use registered select fields here) |
assign pop = ( ( |pop_a ) << sa_reg ) | ( ( |pop_b ) << sb_reg ) | pop_all; |
assign push = ( |push_a ) << sa_reg; |
|
// decode errors |
assign op_code_er = ~( op_ok | ( |op_code_ok ) ); |
|
|
// optional output registers |
pipe |
#( |
.DEPTH ( REGS_OUT ), |
.WIDTH ( TST_W+LG_SEL_W+STACKS+STACKS+STK_W+STK_W+STK_W+IM_W ), |
.RESET_VAL ( 0 ) |
) |
out_regs_vectors |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { tst, lg_sel, push, pop, addr_sel_b, data_sel_b, data_sel_a, im } ), |
.data_o ( { tst_o, lg_sel_o, push_o, pop_o, addr_sel_b_o, data_sel_b_o, data_sel_a_o, im_o } ) |
); |
|
|
pipe |
#( |
.DEPTH ( REGS_OUT ), |
.WIDTH ( 23 ), |
.RESET_VAL ( 0 ) |
) |
out_regs_singles |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { op_code_er, pc_clr, cnd, lit, jmp, gto, intr, stk_clr, imda, imad, sgn, ext, hgh, add, sub, mul, shl, pow, rtn, dm_rd, dm_wr, rg_rd, rg_wr } ), |
.data_o ( { op_code_er_o, pc_clr_o, cnd_o, lit_o, jmp_o, gto_o, intr_o, stk_clr_o, imda_o, imad_o, sgn_o, ext_o, hgh_o, add_o, sub_o, mul_o, shl_o, pow_o, rtn_o, dm_rd_o, dm_wr_o, rg_rd_o, rg_wr_o } ) |
); |
|
|
endmodule |
/trunk/v04.05/COPYRIGHT.txt
0,0 → 1,2
Copyright (c) Eric David Wallin, 2013, 2014. |
Permission to use, copy, modify, and/or distribute this design for any purpose without fee is hereby granted, provided it is not used for spying or "surveillance" uses, military or "defense" projects, weaponry, or other nefarious purposes. Furthermore the above copyright and this permission notice must appear in all copies. |
/trunk/v04.05/uart_core.v
0,0 → 1,138
/* |
-------------------------------------------------------------------------------- |
|
Module: uart_core.v |
|
Function: |
- TX/RX DATA_W,n,1 RS232 UART. |
|
Instantiates: |
- (1x) dds_static.v |
- (1x) uart_tx.v |
- (1x) uart_rx.v |
|
Notes: |
- See individual components for details. |
- Serial loopback does not disconnect serial TX interface. |
- Baud rate is fixed, baud clock is calculated from the input parameters. |
- Common baud rates are 2400, 3600, and 2x multiples of these: |
- 2400, 4800, 9600, 19200, 38400, 76800, 153600 |
- 3600, 7200, 14400, 28800, 57600, 115200 |
|
-------------------------------------------------------------------------------- |
*/ |
|
module uart_core |
#( |
parameter integer CLK_HZ = 160000000, // clk_i rate (Hz) |
parameter integer BAUD_RATE = 115200, // baud rate (Hz) |
parameter integer DATA_W = 8 // parallel data width (bits) |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active hi |
// parallel interface |
input wire [DATA_W-1:0] tx_data_i, // data |
output wire tx_rdy_o, // ready for data, active hi |
input wire tx_wr_i, // data write, active high |
// |
output wire [DATA_W-1:0] rx_data_o, // data |
output wire rx_rdy_o, // ready with data, active hi |
input wire rx_rd_i, // data read, active hi |
// serial interface |
output wire tx_o, // serial data |
input wire rx_i, // serial data |
// debug |
input wire loop_i, // serial loopback enable, active hi |
output wire rx_error_o, // 1=bad start/stop bit; 0=OK |
output wire rx_bad_buffer_o, // bad rx buffering, active hi |
output wire baud_clk_o // baud clock |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
`include "functions.h" // for clog2() |
// |
localparam integer STOP_BITS = 1; // Number of stop bits (1 or larger) |
localparam integer BAUD_OSR = 16; // baud oversample rate (3 or larger) |
// |
// calculations to set DDS parameters |
// |
localparam integer INC_W = 8; // sets maximum error |
localparam real BAUD_HZ = BAUD_RATE*BAUD_OSR; |
localparam real N = CLK_HZ/BAUD_HZ; |
localparam integer ACCUM_W = clog2(N)+INC_W-1; |
localparam integer INC_VAL = (2**ACCUM_W)/N; |
// |
wire rx_bad_start, rx_bad_stop; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
dds_static |
#( |
.ACCUM_W ( ACCUM_W ), |
.INC_VAL ( INC_VAL ) |
) |
dds_static_inst |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.clk_o ( baud_clk_o ) |
); |
|
|
uart_tx |
#( |
.DATA_W ( DATA_W ), |
.BAUD_OSR ( BAUD_OSR ), |
.STOP_BITS ( STOP_BITS ) |
) |
uart_tx_inst |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.baud_clk_i ( baud_clk_o ), |
.tx_data_i ( tx_data_i ), |
.tx_rdy_o ( tx_rdy_o ), |
.tx_wr_i ( tx_wr_i ), |
.tx_o ( tx_o ) |
); |
|
|
uart_rx |
#( |
.DATA_W ( DATA_W ), |
.BAUD_OSR ( BAUD_OSR ) |
) |
uart_rx_inst |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.baud_clk_i ( baud_clk_o ), |
.rx_data_o ( rx_data_o ), |
.rx_rdy_o ( rx_rdy_o ), |
.rx_rd_i ( rx_rd_i ), |
.rx_i ( loop_i ? tx_o : rx_i ), |
.rx_bad_start_o ( rx_bad_start ), |
.rx_bad_stop_o ( rx_bad_stop ), |
.rx_bad_buffer_o ( rx_bad_buffer_o ) |
); |
|
|
// combine errors |
assign rx_error_o = ( rx_bad_start | rx_bad_stop ); |
|
|
endmodule |
/trunk/v04.05/hive_core.qsf
0,0 → 1,71
# -------------------------------------------------------------------------- # |
# |
# Copyright (C) 1991-2010 Altera Corporation |
# Your use of Altera Corporation's design tools, logic functions |
# and other software and tools, and its AMPP partner logic |
# functions, and any output files from any of the foregoing |
# (including device programming or simulation files), and any |
# associated documentation or information are expressly subject |
# to the terms and conditions of the Altera Program License |
# Subscription Agreement, Altera MegaCore Function License |
# Agreement, or other applicable license agreement, including, |
# without limitation, that your use is for the sole purpose of |
# programming logic devices manufactured by Altera and sold by |
# Altera or its authorized distributors. Please refer to the |
# applicable agreement for further details. |
# |
# -------------------------------------------------------------------------- # |
# |
# Quartus II |
# Version 9.1 Build 350 03/24/2010 Service Pack 2 SJ Web Edition |
# Date created = 09:56:16 September 30, 2013 |
# |
# -------------------------------------------------------------------------- # |
# |
# Notes: |
# |
# 1) The default values for assignments are stored in the file: |
# hive_core_assignment_defaults.qdf |
# If this file doesn't exist, see file: |
# assignment_defaults.qdf |
# |
# 2) Altera recommends that you do not modify this file. This |
# file is updated automatically by the Quartus II software |
# and any changes you make may be lost or overwritten. |
# |
# -------------------------------------------------------------------------- # |
|
|
set_global_assignment -name FAMILY "Cyclone III" |
set_global_assignment -name DEVICE EP3C5E144C8 |
set_global_assignment -name TOP_LEVEL_ENTITY hive_core |
set_global_assignment -name ORIGINAL_QUARTUS_VERSION "9.1 SP2" |
set_global_assignment -name PROJECT_CREATION_TIME_DATE "09:56:16 SEPTEMBER 30, 2013" |
set_global_assignment -name LAST_QUARTUS_VERSION "9.1 SP2" |
set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS OFF -section_id eda_blast_fpga |
set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 |
set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 |
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 |
set_global_assignment -name NOMINAL_CORE_SUPPLY_VOLTAGE 1.2V |
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top |
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top |
set_global_assignment -name LL_ROOT_REGION ON -section_id "Root Region" |
set_global_assignment -name LL_MEMBER_STATE LOCKED -section_id "Root Region" |
set_global_assignment -name VECTOR_WAVEFORM_FILE hive_core.vwf |
set_global_assignment -name SIMULATION_MODE FUNCTIONAL |
set_global_assignment -name INCREMENTAL_VECTOR_INPUT_SOURCE hive_core.vwf |
set_global_assignment -name FITTER_EFFORT "STANDARD FIT" |
set_global_assignment -name MAX_RAM_BLOCKS_M4K 24 |
set_global_assignment -name SEED 2 |
set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC OFF |
set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING OFF |
set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION OFF |
set_global_assignment -name PHYSICAL_SYNTHESIS_ASYNCHRONOUS_SIGNAL_PIPELINING OFF |
set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC_FOR_AREA OFF |
set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE SPEED |
set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT EXTRA |
set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS ON |
set_global_assignment -name TIMEQUEST_DO_CCPP_REMOVAL ON |
set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" |
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON |
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top |
/trunk/v04.05/pll.v
0,0 → 1,301
// megafunction wizard: %ALTPLL% |
// GENERATION: STANDARD |
// VERSION: WM1.0 |
// MODULE: altpll |
|
// ============================================================ |
// File Name: pll.v |
// Megafunction Name(s): |
// altpll |
// |
// Simulation Library Files(s): |
// altera_mf |
// ============================================================ |
// ************************************************************ |
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! |
// |
// 10.1 Build 197 01/19/2011 SP 1 SJ Web Edition |
// ************************************************************ |
|
|
//Copyright (C) 1991-2011 Altera Corporation |
//Your use of Altera Corporation's design tools, logic functions |
//and other software and tools, and its AMPP partner logic |
//functions, and any output files from any of the foregoing |
//(including device programming or simulation files), and any |
//associated documentation or information are expressly subject |
//to the terms and conditions of the Altera Program License |
//Subscription Agreement, Altera MegaCore Function License |
//Agreement, or other applicable license agreement, including, |
//without limitation, that your use is for the sole purpose of |
//programming logic devices manufactured by Altera and sold by |
//Altera or its authorized distributors. Please refer to the |
//applicable agreement for further details. |
|
|
// synopsys translate_off |
`timescale 1 ps / 1 ps |
// synopsys translate_on |
module pll ( |
inclk0, |
c0); |
|
input inclk0; |
output c0; |
|
wire [4:0] sub_wire0; |
wire [0:0] sub_wire4 = 1'h0; |
wire [0:0] sub_wire1 = sub_wire0[0:0]; |
wire c0 = sub_wire1; |
wire sub_wire2 = inclk0; |
wire [1:0] sub_wire3 = {sub_wire4, sub_wire2}; |
|
altpll altpll_component ( |
.inclk (sub_wire3), |
.clk (sub_wire0), |
.activeclock (), |
.areset (1'b0), |
.clkbad (), |
.clkena ({6{1'b1}}), |
.clkloss (), |
.clkswitch (1'b0), |
.configupdate (1'b0), |
.enable0 (), |
.enable1 (), |
.extclk (), |
.extclkena ({4{1'b1}}), |
.fbin (1'b1), |
.fbmimicbidir (), |
.fbout (), |
.fref (), |
.icdrclk (), |
.locked (), |
.pfdena (1'b1), |
.phasecounterselect ({4{1'b1}}), |
.phasedone (), |
.phasestep (1'b1), |
.phaseupdown (1'b1), |
.pllena (1'b1), |
.scanaclr (1'b0), |
.scanclk (1'b0), |
.scanclkena (1'b1), |
.scandata (1'b0), |
.scandataout (), |
.scandone (), |
.scanread (1'b0), |
.scanwrite (1'b0), |
.sclkout0 (), |
.sclkout1 (), |
.vcooverrange (), |
.vcounderrange ()); |
defparam |
altpll_component.bandwidth_type = "AUTO", |
altpll_component.clk0_divide_by = 5, |
altpll_component.clk0_duty_cycle = 50, |
altpll_component.clk0_multiply_by = 16, |
altpll_component.clk0_phase_shift = "0", |
altpll_component.compensate_clock = "CLK0", |
altpll_component.inclk0_input_frequency = 20000, |
altpll_component.intended_device_family = "Cyclone III", |
altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll", |
altpll_component.lpm_type = "altpll", |
altpll_component.operation_mode = "NORMAL", |
altpll_component.pll_type = "AUTO", |
altpll_component.port_activeclock = "PORT_UNUSED", |
altpll_component.port_areset = "PORT_UNUSED", |
altpll_component.port_clkbad0 = "PORT_UNUSED", |
altpll_component.port_clkbad1 = "PORT_UNUSED", |
altpll_component.port_clkloss = "PORT_UNUSED", |
altpll_component.port_clkswitch = "PORT_UNUSED", |
altpll_component.port_configupdate = "PORT_UNUSED", |
altpll_component.port_fbin = "PORT_UNUSED", |
altpll_component.port_inclk0 = "PORT_USED", |
altpll_component.port_inclk1 = "PORT_UNUSED", |
altpll_component.port_locked = "PORT_UNUSED", |
altpll_component.port_pfdena = "PORT_UNUSED", |
altpll_component.port_phasecounterselect = "PORT_UNUSED", |
altpll_component.port_phasedone = "PORT_UNUSED", |
altpll_component.port_phasestep = "PORT_UNUSED", |
altpll_component.port_phaseupdown = "PORT_UNUSED", |
altpll_component.port_pllena = "PORT_UNUSED", |
altpll_component.port_scanaclr = "PORT_UNUSED", |
altpll_component.port_scanclk = "PORT_UNUSED", |
altpll_component.port_scanclkena = "PORT_UNUSED", |
altpll_component.port_scandata = "PORT_UNUSED", |
altpll_component.port_scandataout = "PORT_UNUSED", |
altpll_component.port_scandone = "PORT_UNUSED", |
altpll_component.port_scanread = "PORT_UNUSED", |
altpll_component.port_scanwrite = "PORT_UNUSED", |
altpll_component.port_clk0 = "PORT_USED", |
altpll_component.port_clk1 = "PORT_UNUSED", |
altpll_component.port_clk2 = "PORT_UNUSED", |
altpll_component.port_clk3 = "PORT_UNUSED", |
altpll_component.port_clk4 = "PORT_UNUSED", |
altpll_component.port_clk5 = "PORT_UNUSED", |
altpll_component.port_clkena0 = "PORT_UNUSED", |
altpll_component.port_clkena1 = "PORT_UNUSED", |
altpll_component.port_clkena2 = "PORT_UNUSED", |
altpll_component.port_clkena3 = "PORT_UNUSED", |
altpll_component.port_clkena4 = "PORT_UNUSED", |
altpll_component.port_clkena5 = "PORT_UNUSED", |
altpll_component.port_extclk0 = "PORT_UNUSED", |
altpll_component.port_extclk1 = "PORT_UNUSED", |
altpll_component.port_extclk2 = "PORT_UNUSED", |
altpll_component.port_extclk3 = "PORT_UNUSED", |
altpll_component.width_clock = 5; |
|
|
endmodule |
|
// ============================================================ |
// CNX file retrieval info |
// ============================================================ |
// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" |
// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" |
// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" |
// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" |
// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" |
// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" |
// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" |
// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" |
// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" |
// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" |
// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" |
// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" |
// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" |
// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" |
// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "e0" |
// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" |
// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "5" |
// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" |
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "160.000000" |
// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" |
// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" |
// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" |
// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" |
// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" |
// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" |
// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" |
// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "50.000" |
// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" |
// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" |
// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" |
// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" |
// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" |
// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" |
// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" |
// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" |
// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" |
// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" |
// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" |
// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" |
// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" |
// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" |
// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "16" |
// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" |
// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "160.00000000" |
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" |
// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" |
// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" |
// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" |
// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" |
// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" |
// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" |
// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" |
// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" |
// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" |
// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" |
// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" |
// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" |
// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" |
// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" |
// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" |
// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" |
// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" |
// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" |
// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" |
// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" |
// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" |
// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" |
// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" |
// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" |
// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" |
// Retrieval info: PRIVATE: SPREAD_USE STRING "0" |
// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" |
// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" |
// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" |
// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" |
// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" |
// Retrieval info: PRIVATE: USE_CLK0 STRING "1" |
// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" |
// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" |
// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" |
// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all |
// Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" |
// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "5" |
// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" |
// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "16" |
// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" |
// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" |
// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "20000" |
// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" |
// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" |
// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" |
// Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" |
// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" |
// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" |
// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" |
// Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" |
// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" |
// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" |
// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" |
// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 |
// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 |
// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 |
// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE |
// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE |
// Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE |
// Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE |
// Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE |
// Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.v FALSE |
// Retrieval info: GEN_FILE: TYPE_NORMAL pll_bb.v FALSE |
// Retrieval info: LIB_FILE: altera_mf |
// Retrieval info: CBX_MODULE_PREFIX: ON |
/trunk/v04.05/reg_set.v
0,0 → 1,625
/* |
-------------------------------------------------------------------------------- |
|
Module: reg_set.v |
|
Function: |
- Internal register set for a processor. |
|
Instantiates: |
- (8x) reg_base.v |
- (2x) pipe.v |
|
|
Notes: |
- Processor bus IN/OUT optionally registered. |
|
Decode: |
- 0x0 : Core version register - ver_reg |
- 0x1 : Thread ID register - thrd_id_reg |
- 0x2 : Clear register - clr_reg |
- 0x3 : Interrupt enable register - intr_en_reg |
- 0x4 : Opcode error register - op_er_reg |
- 0x5 : Stack error register - stk_er_reg |
- 0x6 - 0x7 : UNUSED |
- 0x8 : I/O low register - io_lo_reg |
- 0x9 : I/O high register - io_hi_reg |
- 0xA - 0xB : UNUSED |
- 0xC : UART RX register - uart_rx_reg |
- 0xD : UART TX register - uart_tx_reg |
- 0xE - 0xF : UNUSED |
|
|
================================================================================ |
- 0x0 : Core version register - ver_reg |
-------------------------------------------------------------------------------- |
|
bit name description |
----- ---- ----------- |
7-0 ver_min[7:0] minor version info |
15-8 ver_maj[7:0] major version info |
|
Notes: |
- Read-only. |
- Nibbles S/B BCD (0-9; no A-F) to be easily human readable, |
and to eliminate confusion between decimal and hex here. |
- Major version changes when op_code binary decode changes (incompatibilty). |
|
================================================================================ |
- 0x1 : Thread ID register - thrd_id_reg |
-------------------------------------------------------------------------------- |
|
bit name description |
----- ---- ----------- |
2-0 thrd_id[2:0] thread ID |
15-3 - 0000000000000 |
|
Notes: |
- Read-only. |
- Threads can read this to discover their thread ID. |
|
================================================================================ |
- 0x2 : Clear register - clr_reg |
-------------------------------------------------------------------------------- |
|
bit name description |
----- ---- ----------- |
7-0 clr[7:0] 0=>1 clear thread; 1=>0 no effect; |
15-8 - 00000000 |
|
Notes: |
- Read / write. |
- Per thread clearing. |
- All bits cleared on async reset. |
|
================================================================================ |
- 0x3 : Interrupt enable register - intr_en_reg |
-------------------------------------------------------------------------------- |
|
bit name description |
----- ---- ----------- |
7-0 intr_en[7:0] 1=thread interrupt enable; 0=disable |
15-8 - 00000000 |
|
Notes: |
- Read / write. |
- Per thread enabling of interrupts. |
- All bits cleared on async reset. |
|
================================================================================ |
- 0x4 : Opcode error register - op_er_reg |
-------------------------------------------------------------------------------- |
|
bit name description |
----- ---- ----------- |
7-0 op_er[7:0] 1=opcode error; 0=OK |
15-8 - 00000000 |
|
Notes: |
- Clear on write one. |
- Per thread opcode error reporting. |
|
================================================================================ |
- 0x5 : Stack error register - stk_er_reg |
-------------------------------------------------------------------------------- |
|
bit name description |
----- ---- ----------- |
7-0 pop_er[7:0] 1=lifo pop when empty; 0=OK |
15-8 push_er[7:0] 1=lifo push when full; 0=OK |
|
Notes: |
- Clear on write one. |
- Per thread LIFO stack error reporting. |
|
================================================================================ |
- 0x6 - 0x7 : UNUSED |
================================================================================ |
- 0x8 : I/O low register - io_lo_reg |
-------------------------------------------------------------------------------- |
|
bit name description |
----- ---- ----------- |
15-0 io_lo[15:0] I/O data |
|
Notes: |
- Separate read / write. |
- Reads of io_lo_reg freeze data in io_hi_reg, so read io_lo_reg first then |
read io_hi_reg for contiguous wide (32 bit) data reads. |
- Writes function normally. |
|
================================================================================ |
- 0x9 : I/O high register - io_hi_reg |
-------------------------------------------------------------------------------- |
|
bit name description |
----- ---- ----------- |
15-0 io_hi[15:0] I/O data |
|
Notes: |
- Separate read / write. |
- Reads of io_lo_reg freeze data in io_hi_reg, so read io_lo_reg first then |
read io_hi_reg for contiguous wide (32 bit) data reads. |
- Writes function normally. |
|
================================================================================ |
- 0xA - 0xB : UNUSED |
================================================================================ |
- 0xC : UART RX register - uart_rx_reg |
-------------------------------------------------------------------------------- |
|
bit name description |
----- ---- ----------- |
7-0 uart_rx_data[7:0] RX UART data |
8 rx_rdy 1=RX UART ready (has new data); 0=not ready |
15-9 - 0000000 |
|
Notes: |
- Reads from this register pop data from the RX UART. |
- To avoid RX data loss, read soon after RX UART is ready. |
- UART ready bit will self clear after associated register operation. |
|
================================================================================ |
- 0xD : UART TX register - uart_tx_reg |
-------------------------------------------------------------------------------- |
|
bit name description |
----- ---- ----------- |
7-0 uart_tx_data[7:0] TX UART data |
8 tx_rdy 1=TX UART ready (for new data); 0=not ready |
15-9 - 0000000 |
|
Notes: |
- Writes to this register push data to the TX UART. |
- To avoid TX data loss, restrict writes to when TX UART is ready. |
- UART ready bit will self clear after associated register operation. |
|
================================================================================ |
- 0xE - 0xF : UNUSED |
================================================================================ |
*/ |
|
module reg_set |
#( |
parameter integer REGS_IN = 1, // bus in register option |
parameter integer REGS_OUT = 1, // bus out register option |
parameter integer DATA_W = 16, // data width (bits) |
parameter integer ADDR_W = 4, // address width (bits) |
parameter integer THREADS = 8, // threads |
parameter integer THRD_W = 3, // thread selector width |
parameter integer STACKS = 8, // stacks |
parameter integer STK_W = 3, // stack selector width |
// |
parameter [DATA_W/2-1:0] VER_MAJ = 'h1, // core version |
parameter [DATA_W/2-1:0] VER_MIN = 'h0, |
// |
parameter integer UART_DATA_W = 8, // uart data width (bits) |
parameter integer CLK_HZ = 160000000, // master clk_i rate (Hz) |
parameter integer UART_BAUD_RATE = 115200 // uart baud rate (Hz) |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// bus interface |
input wire [ADDR_W-1:0] addr_i, // address |
input wire wr_i, // data write enable, active high |
input wire rd_i, // data read enable, active high |
input wire [DATA_W-1:0] data_i, // write data |
output wire [DATA_W-1:0] data_o, // read data |
// clear |
output wire [THREADS-1:0] clr_req_o, // clr request, active high |
// interrupt |
output wire [THREADS-1:0] intr_en_o, // interrupt enable, active high |
// errors |
input wire [THRD_W-1:0] thrd_0_i, // thread |
input wire op_code_er_i, // 1=illegal op code encountered |
input wire [THRD_W-1:0] thrd_2_i, // thread |
input wire [STACKS-1:0] pop_er_2_i, // pop when empty, active high |
input wire [THRD_W-1:0] thrd_3_i, // thread |
input wire [STACKS-1:0] push_er_3_i, // push when full, active high |
// I/O |
input wire [DATA_W-1:0] io_lo_i, // gpio linked to io_hi_i |
input wire [DATA_W-1:0] io_hi_i, |
output wire [DATA_W-1:0] io_lo_o, // unlinked gpio |
output wire [DATA_W-1:0] io_hi_o, |
// serial interface |
input wire uart_rx_i, // serial data |
output wire uart_tx_o // serial data |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
`include "reg_set_addr.h" |
// |
wire [ADDR_W-1:0] addr; |
wire reg_en, wr, rd; |
wire [DATA_W-1:0] rd_data, wr_data, reg_rd_data; |
wire [DATA_W-1:0] ver_rd_data, |
thrd_id_rd_data, |
clr_rd_data, |
intr_en_rd_data, |
op_er_rd_data, |
stk_er_data, |
io_lo_rd_data, |
io_hi_rd_data, |
uart_rx_rd_data, |
uart_tx_rd_data; |
// |
wire io_lo_reg_rd; |
wire [THREADS-1:0] op_code_errors, push_errors, pop_errors; |
wire [UART_DATA_W-1:0] uart_tx_data, uart_rx_data; |
wire uart_tx_rdy, uart_rx_rdy; |
wire uart_tx_wr, uart_rx_rd; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
|
// optional bus input regs |
pipe |
#( |
.DEPTH ( REGS_IN ), |
.WIDTH ( 2+ADDR_W+DATA_W ), |
.RESET_VAL ( 0 ) |
) |
in_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { wr_i, rd_i, addr_i, data_i } ), |
.data_o ( { wr, rd, addr, wr_data } ) |
); |
|
|
// big ORing of read data |
assign rd_data = |
ver_rd_data | |
thrd_id_rd_data | |
clr_rd_data | |
intr_en_rd_data | |
op_er_rd_data | |
stk_er_data | |
io_lo_rd_data | |
io_hi_rd_data | |
uart_rx_rd_data | |
uart_tx_rd_data; |
|
|
// optional output regs |
pipe |
#( |
.DEPTH ( REGS_OUT ), |
.WIDTH ( DATA_W ), |
.RESET_VAL ( 0 ) |
) |
out_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( rd_data ), |
.data_o ( data_o ) |
); |
|
|
|
/* |
------------- |
-- ver_reg -- |
------------- |
*/ |
|
reg_base |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.ADDRESS ( VER_ADDR[ADDR_W-1:0] ), |
.OUT_MODE ( "ZERO" ), |
.READ_MODE ( "THRU" ) |
) |
ver_reg |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( addr ), |
.wr_i ( wr ), |
.rd_i ( rd ), |
.wr_data_i ( wr_data ), |
.rd_data_o ( ver_rd_data ), |
.reg_data_i ( { VER_MAJ, VER_MIN } ) |
); |
|
|
/* |
----------------- |
-- thrd_id_reg -- |
----------------- |
*/ |
|
reg_base |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.ADDRESS ( THRD_ID_ADDR[ADDR_W-1:0] ), |
.OUT_MODE ( "ZERO" ), |
.READ_MODE ( "THRU" ), |
.LIVE_MASK ( { THRD_W{ 1'b1 } } ) |
) |
thrd_id_reg |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( addr ), |
.wr_i ( wr ), |
.rd_i ( rd ), |
.wr_data_i ( wr_data ), |
.rd_data_o ( thrd_id_rd_data ), |
.reg_data_i ( thrd_3_i ) |
); |
|
|
/* |
------------- |
-- clr_reg -- |
------------- |
*/ |
reg_base |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.ADDRESS ( CLR_ADDR[ADDR_W-1:0] ), |
.OUT_MODE ( "LTCH" ), |
.READ_MODE ( "LOOP" ), |
.LIVE_MASK ( { THREADS{ 1'b1 } } ) |
) |
clr_reg |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( addr ), |
.wr_i ( wr ), |
.rd_i ( rd ), |
.wr_data_i ( wr_data ), |
.rd_data_o ( clr_rd_data ), |
.reg_data_o ( clr_req_o ) |
); |
|
|
/* |
----------------- |
-- intr_en_reg -- |
----------------- |
*/ |
reg_base |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.ADDRESS ( INTR_EN_ADDR[ADDR_W-1:0] ), |
.OUT_MODE ( "LTCH" ), |
.READ_MODE ( "LOOP" ), |
.LIVE_MASK ( { THREADS{ 1'b1 } } ) |
) |
intr_en_reg |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( addr ), |
.wr_i ( wr ), |
.rd_i ( rd ), |
.wr_data_i ( wr_data ), |
.rd_data_o ( intr_en_rd_data ), |
.reg_data_o ( intr_en_o ) |
); |
|
|
/* |
--------------- |
-- op_er_reg -- |
--------------- |
*/ |
reg_base |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.ADDRESS ( OP_ER_ADDR[ADDR_W-1:0] ), |
.OUT_MODE ( "ZERO" ), |
.READ_MODE ( "COW1" ), |
.LIVE_MASK ( { THREADS{ 1'b1 } } ) |
) |
op_er_reg |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( addr ), |
.wr_i ( wr ), |
.rd_i ( rd ), |
.wr_data_i ( wr_data ), |
.rd_data_o ( op_er_rd_data ), |
.reg_data_i ( op_code_errors ) |
); |
|
// decode errors |
assign op_code_errors = op_code_er_i << thrd_0_i; |
|
|
/* |
---------------- |
-- stk_er_reg -- |
---------------- |
*/ |
reg_base |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.ADDRESS ( STK_ER_ADDR[ADDR_W-1:0] ), |
.OUT_MODE ( "ZERO" ), |
.READ_MODE ( "COW1" ), |
.LIVE_MASK ( { (THREADS+THREADS){ 1'b1 } } ) |
) |
stk_er_reg |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( addr ), |
.wr_i ( wr ), |
.rd_i ( rd ), |
.wr_data_i ( wr_data ), |
.rd_data_o ( stk_er_data ), |
.reg_data_i ( { push_errors, pop_errors } ) |
); |
|
// decode errors |
assign push_errors = |push_er_3_i << thrd_3_i; |
assign pop_errors = |pop_er_2_i << thrd_2_i; |
|
|
/* |
--------------- |
-- io_lo_reg -- |
--------------- |
*/ |
reg_base |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.ADDRESS ( IO_LO_ADDR[ADDR_W-1:0] ), |
.OUT_MODE ( "LTCH" ), |
.READ_MODE ( "THRU" ) |
) |
io_lo_reg |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( addr ), |
.wr_i ( wr ), |
.rd_i ( rd ), |
.wr_data_i ( wr_data ), |
.rd_data_o ( io_lo_rd_data ), |
.reg_rd_o ( io_lo_reg_rd ), |
.reg_data_i ( io_lo_i ), |
.reg_data_o ( io_lo_o ) |
); |
|
|
/* |
--------------- |
-- io_hi_reg -- |
--------------- |
*/ |
reg_base |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.ADDRESS ( IO_HI_ADDR[ADDR_W-1:0] ), |
.OUT_MODE ( "LTCH" ), |
.READ_MODE ( "DFFE" ) |
) |
io_hi_reg |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( addr ), |
.wr_i ( wr ), |
.rd_i ( rd ), |
.wr_data_i ( wr_data ), |
.rd_data_o ( io_hi_rd_data ), |
.reg_en_i ( io_lo_reg_rd ), // enable on lo read |
.reg_data_i ( io_hi_i ), |
.reg_data_o ( io_hi_o ) |
); |
|
|
/* |
----------------- |
-- uart_rx_reg -- |
----------------- |
*/ |
reg_base |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.ADDRESS ( UART_RX_ADDR[ADDR_W-1:0] ), |
.OUT_MODE ( "ZERO" ), |
.READ_MODE ( "THRU" ), |
.LIVE_MASK ( { 1+UART_DATA_W{ 1'b1 } } ) |
) |
uart_rx_reg |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( addr ), |
.wr_i ( wr ), |
.rd_i ( rd ), |
.wr_data_i ( wr_data ), |
.rd_data_o ( uart_rx_rd_data ), |
.reg_rd_o ( uart_rx_rd ), |
.reg_data_i ( { uart_rx_rdy, uart_rx_data } ), |
.reg_data_o ( ) |
); |
|
|
/* |
----------------- |
-- uart_tx_reg -- |
----------------- |
*/ |
reg_base |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.ADDRESS ( UART_TX_ADDR[ADDR_W-1:0] ), |
.OUT_MODE ( "THRU" ), |
.READ_MODE ( "THRU" ), |
.LIVE_MASK ( { 1+UART_DATA_W{ 1'b1 } } ) |
) |
uart_tx_reg |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( addr ), |
.wr_i ( wr ), |
.rd_i ( rd ), |
.wr_data_i ( wr_data ), |
.rd_data_o ( uart_tx_rd_data ), |
.reg_wr_o ( uart_tx_wr ), |
.reg_data_i ( { uart_tx_rdy, { UART_DATA_W{ 1'b0 } } } ), |
.reg_data_o ( uart_tx_data ) |
); |
|
|
uart_core |
#( |
.CLK_HZ ( CLK_HZ ), |
.BAUD_RATE ( UART_BAUD_RATE ), |
.DATA_W ( UART_DATA_W ) |
) |
uart_core_inst |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.tx_data_i ( uart_tx_data ), |
.tx_rdy_o ( uart_tx_rdy ), |
.tx_wr_i ( uart_tx_wr ), |
.rx_data_o ( uart_rx_data ), |
.rx_rdy_o ( uart_rx_rdy ), |
.rx_rd_i ( uart_rx_rd ), |
.tx_o ( uart_tx_o ), |
.rx_i ( uart_rx_i ), |
.loop_i ( 1'b0 ), // unused |
.rx_error_o ( ), // unused |
.rx_bad_buffer_o ( ), // unused |
.baud_clk_o ( ) // unused |
); |
|
|
endmodule |
/trunk/v04.05/ep4ce6e22c8_demo_board.qsf
0,0 → 1,94
# -------------------------------------------------------------------------- # |
# |
# Copyright (C) 1991-2011 Altera Corporation |
# Your use of Altera Corporation's design tools, logic functions |
# and other software and tools, and its AMPP partner logic |
# functions, and any output files from any of the foregoing |
# (including device programming or simulation files), and any |
# associated documentation or information are expressly subject |
# to the terms and conditions of the Altera Program License |
# Subscription Agreement, Altera MegaCore Function License |
# Agreement, or other applicable license agreement, including, |
# without limitation, that your use is for the sole purpose of |
# programming logic devices manufactured by Altera and sold by |
# Altera or its authorized distributors. Please refer to the |
# applicable agreement for further details. |
# |
# -------------------------------------------------------------------------- # |
# |
# Quartus II |
# Version 11.0 Build 157 04/27/2011 SJ Full Version |
# Date created = 17:14:01 April 10, 2012 |
# |
# -------------------------------------------------------------------------- # |
# |
# Notes: |
# |
# 1) The default values for assignments are stored in the file: |
# LED_4_assignment_defaults.qdf |
# If this file doesn't exist, see file: |
# assignment_defaults.qdf |
# |
# 2) Altera recommends that you do not modify this file. This |
# file is updated automatically by the Quartus II software |
# and any changes you make may be lost or overwritten. |
# |
# -------------------------------------------------------------------------- # |
|
|
set_global_assignment -name FAMILY "Cyclone IV E" |
set_global_assignment -name DEVICE EP4CE6E22C8 |
set_global_assignment -name TOP_LEVEL_ENTITY ep4ce6e22c8_demo_board |
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.0 |
set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:14:01 APRIL 10, 2012" |
set_global_assignment -name LAST_QUARTUS_VERSION "10.1 SP1" |
set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 |
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 |
set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 |
set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 |
set_global_assignment -name VERILOG_FILE ep4ce6e22c8_demo_board.v |
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top |
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top |
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top |
set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" |
set_location_assignment PIN_3 -to led_o[0] |
set_location_assignment PIN_7 -to led_o[1] |
set_location_assignment PIN_10 -to led_o[2] |
set_location_assignment PIN_11 -to led_o[3] |
set_location_assignment PIN_23 -to clk_50m_i |
set_location_assignment PIN_125 -to rstn_i |
set_global_assignment -name USE_CONFIGURATION_DEVICE ON |
set_global_assignment -name STRATIX_CONFIGURATION_DEVICE EPCS16 |
set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS PROGRAMMING PIN" |
set_global_assignment -name RESERVE_ASDO_AFTER_CONFIGURATION "AS INPUT TRI-STATED" |
set_global_assignment -name CYCLONEIII_CONFIGURATION_DEVICE EPCS16 |
set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF |
set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" |
set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "COMPILER CONFIGURED" |
set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "COMPILER CONFIGURED" |
set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "COMPILER CONFIGURED" |
set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "COMPILER CONFIGURED" |
set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise |
set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall |
set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise |
set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall |
set_global_assignment -name DEVICE_FILTER_PACKAGE TQFP |
set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 |
set_global_assignment -name NOMINAL_CORE_SUPPLY_VOLTAGE 1.2V |
set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE SPEED |
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON |
set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" |
set_global_assignment -name FITTER_EFFORT "STANDARD FIT" |
set_global_assignment -name SDC_FILE ep4ce6e22c8_demo_board.sdc |
set_global_assignment -name MAX_RAM_BLOCKS_M4K 24 |
set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC OFF |
set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING OFF |
set_global_assignment -name PHYSICAL_SYNTHESIS_ASYNCHRONOUS_SIGNAL_PIPELINING OFF |
set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION OFF |
set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC_FOR_AREA OFF |
set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT EXTRA |
set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" |
set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" |
set_global_assignment -name SEED 2 |
set_global_assignment -name MISC_FILE "F:/Docs/Eric/VERILOG/THRASH/HIVE88/ep4ce6e22c8_demo_board.dpf" |
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top |
/trunk/v04.05/boot_code/boot_code_v_io.h
0,0 → 1,236
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "op_encode.h" |
`include "reg_set_addr.h" |
`include "boot_code_defs.h" |
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `__, `__ }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
// Thread 0 : test I/O functions |
// All other threads : loop forever |
|
/////////////// |
// clr space // |
/////////////// |
|
// thread 0 |
i='h0; ram[i] = { `lit_u, `__, `s2 }; // s2='h0100 |
i=i+1; ram[i] = 16'h0100 ; // |
i=i+1; ram[i] = { `gto, `P2, `__ }; // goto, pop s2 (addr) |
// thread 1 |
i='h4; ram[i] = { `lit_u, `__, `s2 }; // s2='h0200 |
i=i+1; ram[i] = 16'h0200 ; // |
i=i+1; ram[i] = { `gto, `P2, `__ }; // goto, pop s2 (addr) |
// and the rest |
i='h08; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h0c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
//////////////// |
// intr space // |
//////////////// |
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
|
// test I/O functions, result in s0 |
// Correct functioning is s0 = 'd8 ('h8). |
// |
// s0 : final test result |
// s1 : test value |
// s2 : test value |
// s3 : running test result, subroutine return address |
// |
// setup running test result: |
i='h100; ram[i] = { `dat_is, 6'd0, `s3 }; // s3=0 |
// PGC |
i=i+1; ram[i] = { `pgc, `__, `s1 }; // s1=PC |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h0102 |
i=i+1; ram[i] = 16'h0102 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// setup test value: |
i=i+1; ram[i] = { `lit_u, `__, `s1 }; // s1='h36c9,a53c |
i=i+1; ram[i] = 16'ha53c ; // |
i=i+1; ram[i] = { `lit_h, `__, `P1 }; // |
i=i+1; ram[i] = 16'h36c9 ; // |
// MEM_IWH & MEM_IRH |
i=i+1; ram[i] = { `lit_u, `__, `s2 }; // s2='h0a00 |
i=i+1; ram[i] = 16'h0a00 ; // |
i=i+1; ram[i] = { `mem_iw, 4'd0, `s2, `s1 }; // (s2+offset)=s1 |
i=i+1; ram[i] = { `mem_iwh, 4'd1, `s2, `s1 }; // |
i=i+1; ram[i] = { `mem_irs, 4'd0, `s2, `s0 }; // s0=(s2+offset) |
i=i+1; ram[i] = { `mem_irh, 4'd1, `P2, `P0 }; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `s1, `P0 }; // (s0==s1) ? skip, pop s0 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// MEM_IRS (signed) |
i=i+1; ram[i] = { `lit_u, `__, `s2 }; // s2='h0a00 |
i=i+1; ram[i] = 16'h0a10 ; // |
i=i+1; ram[i] = { `mem_iw, 4'd0, `s2, `s1 }; // (s2+offset)=s1 |
i=i+1; ram[i] = { `mem_irs, 4'd0, `P2, `s0 }; // s0=(s2+offset), pop s2 |
i=i+1; ram[i] = { `shl_is, 6'd16, `s1 }; // s1<<=16 |
i=i+1; ram[i] = { `shl_is, -6'd16, `P1 }; // s1>>=16 |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// MEM_IRS (unsigned) |
i=i+1; ram[i] = { `lit_u, `__, `s2 }; // s2='h0a00 |
i=i+1; ram[i] = 16'h0a20 ; // |
i=i+1; ram[i] = { `mem_iwh, 4'd0, `s2, `s1 }; // (s2+offset)=s1 |
i=i+1; ram[i] = { `mem_irs, 4'd0, `P2, `s0 }; // s0=(s2+offset), pop s2 |
i=i+1; ram[i] = { `psu_i, -6'd16, `s1 }; // s1>>=16 |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// REG_RS, REG_RH, REG_W & REG_WH (check manually for I/O loopback) |
i=i+1; ram[i] = { `dat_is, `IO_LO, `s2 }; // s2=reg addr |
i=i+1; ram[i] = { `reg_rs, `s2, `s1 }; // s1=(s2) |
i=i+1; ram[i] = { `reg_w, `P2, `P1 }; // (s2)=s1, pop both |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s2 }; // s2=reg addr |
i=i+1; ram[i] = { `reg_rh, `s2, `s1 }; // s1=(s2) |
i=i+1; ram[i] = { `reg_wh, `P2, `P1 }; // (s2)=s1, pop s2 |
// LIT_S |
i=i+1; ram[i] = { `lit_s, `__, `s0 }; // s0='ha53c |
i=i+1; ram[i] = 16'ha53c ; // |
i=i+1; ram[i] = { `shl_is, 6'd16, `s1 }; // s1<<=16 |
i=i+1; ram[i] = { `shl_is, -6'd16, `P1 }; // s1>>=16, pop s1 |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// LIT_U |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='ha53c |
i=i+1; ram[i] = 16'ha53c ; // |
i=i+1; ram[i] = { `shl_is, 6'd16, `s1 }; // s1<<=16 |
i=i+1; ram[i] = { `psu_i, -6'd16, `P1 }; // s1>>=16, pop s1 |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no opcode errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0900 |
i=i+1; ram[i] = 16'h0900 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0910 |
i=i+1; ram[i] = 16'h0910 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s2 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// copy result to s0 |
i=i+1; ram[i] = { `cpy, `P3, `s0 }; // s0=s3, pop s3 |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
// end sub |
|
|
// test UART |
// |
// s0 : TX value |
// s1 : |
// s2 : reg addr |
// s3 : |
// s4 : TX ready |
// |
// |
i='h200; ram[i] = { `lit_u, `__, `s0 }; // s0='h00a5 |
i=i+1; ram[i] = 16'h00a5 ; // |
i=i+1; ram[i] = { `dat_is, `UART_TX, `s2 }; // s2=reg addr |
i=i+1; ram[i] = { `reg_rs, `s2, `s4 }; // s4=(s2) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `reg_w, `s2, `s0 }; // (s2)=s0 |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
// end sub |
|
|
///////////////// |
// subroutines // |
///////////////// |
|
|
// sub : read & clear opcode errors for this thread => s4, return to (s7) |
// avoid the use of s1! |
i='h900; ram[i] = { `dat_is, `THRD_ID, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `P6, `s5 }; // s5=(s6), pop s6 |
i=i+1; ram[i] = { `pow, `P5, `s4 }; // s4=1<<s5, pop s5 |
i=i+1; ram[i] = { `dat_is, `OP_ER, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `s6, `s5 }; // s5=(s6) |
i=i+1; ram[i] = { `and, `P5, `P4 }; // s4&=s5, pop s5 |
i=i+1; ram[i] = { `reg_w, `P6, `s4 }; // (s6)=s4, pop s6 |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return to (s7), pop s7 |
|
|
// sub : read & clear stack errors for this thread => s4, return to (s7) |
// avoid the use of s1! |
i='h910; ram[i] = { `dat_is, `THRD_ID, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `P6, `s5 }; // s5=(s6), pop s6 |
i=i+1; ram[i] = { `pow, `P5, `s4 }; // s4=1<<s5, pop s5 |
i=i+1; ram[i] = { `cpy, `s4, `s5 }; // s5=s4 |
i=i+1; ram[i] = { `shl_is, 6'd8, `P5 }; // s5<<=8 |
i=i+1; ram[i] = { `orr, `P5, `P4 }; // s4|=s5, pop s5 |
i=i+1; ram[i] = { `dat_is, `STK_ER, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `s6, `s5 }; // s5=(s6) |
i=i+1; ram[i] = { `and, `P5, `P4 }; // s4&=s5, pop s5 |
i=i+1; ram[i] = { `reg_w, `P6, `s4 }; // (s6)=s4, pop s6 |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return to (s7), pop s7 |
|
|
end |
/trunk/v04.05/boot_code/boot_code_v_stacks.h
0,0 → 1,236
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "op_encode.h" |
`include "reg_set_addr.h" |
`include "boot_code_defs.h" |
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `__, `__ }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
// Thread 0 : test stack 1 for depth and error reporting |
// All other threads : loop forever |
|
/////////////// |
// clr space // |
/////////////// |
|
// thread 0 |
i='h0; ram[i] = { `lit_u, `__, `s2 }; // s2='h0100 |
i=i+1; ram[i] = 16'h0100 ; // |
i=i+1; ram[i] = { `gto, `P2, `__ }; // goto, pop s2 (addr) |
// and the rest |
i='h04; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h08; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h0c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
//////////////// |
// intr space // |
//////////////// |
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
|
// test s1 for correct stack depth and error reporting, result in s0 |
// Correct functioning is s0 = 'd7 ('h7). |
// |
// s0 : final test result |
// s1 : test stack |
// s2 : sub addr |
// s3 : running test result, subroutine return address |
// |
// setup running test result: |
i='h100; ram[i] = { `dat_is, 6'd0, `s7 }; // s7=0 |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7=addr |
i=i+1; ram[i] = 16'h0910 ; // addr |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr), return to s7 |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// fill s1 |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7=addr |
i=i+1; ram[i] = 16'h0940 ; // addr |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr), return to s7 |
// check for push error |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7=addr |
i=i+1; ram[i] = 16'h0910 ; // addr |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr), return to s7 |
i=i+1; ram[i] = { `psu_i, -6'd8, `P4 }; // s4>>=8 |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// pop&push s/b OK |
i=i+1; ram[i] = { `add_is, 6'd0, `P1 }; // s1=s1 |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7=addr |
i=i+1; ram[i] = 16'h0910 ; // addr |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr), return to s7 |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// s/b one push over the line |
i=i+1; ram[i] = { `add_is, 6'd0, `s1 }; // s1=>s1 |
// check for a push error |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7=addr |
i=i+1; ram[i] = 16'h0910 ; // addr |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr), return to s7 |
i=i+1; ram[i] = { `psu_i, -6'd8, `P4 }; // s4>>=8 |
i=i+1; ram[i] = { `jmp_inz, 6'd1, `P4 }; // (s4!=0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// empty s1 |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7=addr |
i=i+1; ram[i] = 16'h0950 ; // addr |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr), return to s7 |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7=addr |
i=i+1; ram[i] = 16'h0910 ; // addr |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr), return to s7 |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// s/b one pop under the line |
i=i+1; ram[i] = { `pop, 8'b00000010 }; // pop s1 |
// check for a pop error |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7=addr |
i=i+1; ram[i] = 16'h0910 ; // addr |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr), return to s7 |
i=i+1; ram[i] = { `shl_is, 6'd24, `P4 }; // s4<<=24 |
i=i+1; ram[i] = { `jmp_inz, 6'd1, `P4 }; // (s4!=0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no opcode errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7=addr |
i=i+1; ram[i] = 16'h0900 ; // addr |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr), return to s7 |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// copy result to s0 |
i=i+1; ram[i] = { `cpy, `P3, `s0 }; // s0=s3, pop s3 |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
|
///////////////// |
// subroutines // |
///////////////// |
|
|
// sub : read & clear opcode errors for this thread => s4, return to (s7) |
// avoid the use of s1! |
i='h900; ram[i] = { `dat_is, `THRD_ID, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `P6, `s5 }; // s5=(s6), pop s6 |
i=i+1; ram[i] = { `pow, `P5, `s4 }; // s4=1<<s5, pop s5 |
i=i+1; ram[i] = { `dat_is, `OP_ER, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `s6, `s5 }; // s5=(s6) |
i=i+1; ram[i] = { `and, `P5, `P4 }; // s4&=s5, pop s5 |
i=i+1; ram[i] = { `reg_w, `P6, `s4 }; // (s6)=s4, pop s6 |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return to (s7), pop s7 |
|
|
// sub : read & clear stack errors for this thread => s4, return to (s7) |
// avoid the use of s1! |
i='h910; ram[i] = { `dat_is, `THRD_ID, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `P6, `s5 }; // s5=(s6), pop s6 |
i=i+1; ram[i] = { `pow, `P5, `s4 }; // s4=1<<s5, pop s5 |
i=i+1; ram[i] = { `cpy, `s4, `s5 }; // s5=s4 |
i=i+1; ram[i] = { `shl_is, 6'd8, `P5 }; // s5<<=8 |
i=i+1; ram[i] = { `orr, `P5, `P4 }; // s4|=s5, pop s5 |
i=i+1; ram[i] = { `dat_is, `STK_ER, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `s6, `s5 }; // s5=(s6) |
i=i+1; ram[i] = { `and, `P5, `P4 }; // s4&=s5, pop s5 |
i=i+1; ram[i] = { `reg_w, `P6, `s4 }; // (s6)=s4, pop s6 |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return to (s7), pop s7 |
|
|
// sub : read 32 bit GPIO => s0, return to (s7) |
i='h920; ram[i] = { `dat_is, `IO_LO, `s3 }; // s3=reg addr |
i=i+1; ram[i] = { `reg_rs, `P3, `s0 }; // s0=(s3), pop s3 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s3 }; // s3=reg addr |
i=i+1; ram[i] = { `reg_rh, `P3, `P0 }; // s0=(s3), pop both |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return, pop s7 |
|
|
// sub : write s0 => 32 bit GPIO, return to (s7) |
i='h930; ram[i] = { `dat_is, `IO_LO, `s3 }; // s3=reg addr |
i=i+1; ram[i] = { `reg_w, `P3, `s0 }; // (s3)=s0, pop s3 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s3 }; // s3=reg addr |
i=i+1; ram[i] = { `reg_wh, `P3, `s0 }; // (s3)=s0, pop s3 |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return, pop s7 |
|
|
// sub : push 32x to s1, return to (s7) |
// loop setup: |
i='h940; ram[i] = { `dat_is, 6'd31, `s1 }; // s1=31 // first push (& loop index) |
// loop |
i=i+1; ram[i] = { `add_is, -6'd1, `s1 }; // s1=s1-1 |
i=i+1; ram[i] = { `jmp_inz, -6'd2, `s1 }; // (s1!=0) ? do again |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return, pop s7 |
|
|
// sub : pop 32x from s1, return to (s7) |
// loop setup: |
i='h950; ram[i] = { `dat_is, 6'd31, `s2 }; // s2=31 |
// loop |
i=i+1; ram[i] = { `pop, 8'b00000010 }; // pop s1 |
i=i+1; ram[i] = { `add_is, -6'd1, `P2 }; // s2-- |
i=i+1; ram[i] = { `jmp_inlz, -6'd3, `s2 }; // (s2>=0) ? do again |
i=i+1; ram[i] = { `gto, `P7, `P2 }; // return, pop s7 & s2 |
|
|
end |
/trunk/v04.05/boot_code/boot_code_exp2.h
0,0 → 1,184
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "boot_code_defs.h" |
`include "op_encode.h" |
`include "reg_set_addr.h" |
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `s0, `s0 }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
/* |
------------ |
-- TEST 0 -- |
------------ |
*/ |
|
// Log base 2 |
// Thread 0 : Get input 32 bit GPIO, calculate log2, output 32 bit GPIO. |
// Other threads : do nothing, loop forever |
|
/////////////// |
// clr space // |
/////////////// |
|
i='h0; ram[i] = { `lit_u, `__, `s1 }; // s1=addr |
i=i+1; ram[i] = 16'h0040 ; // |
i=i+1; ram[i] = { `gto, `P1, `__ }; // goto, pop s1 (addr) |
// |
i='h04; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h08; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h0c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
//////////////// |
// intr space // |
//////////////// |
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
// read & write 32 bit GPIO data to & from s0 |
i='h40; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0080 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
// do s0=exp2(s0) |
i=i+1; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0090 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s7 }; // gsb, pop s3 (addr) |
// write s0 data to 32 bit GPIO |
i=i+1; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0070 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
// sub : read 32 bit GPIO => s0, return to (s3) |
i='h60; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rs, `P1, `s0 }; // s0=(s1), pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rh, `P1, `P0 }; // s0=(s1), pop both |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
// sub : write s0 => 32 bit GPIO, return to (s3) |
i='h70; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_w, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_wh, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
// sub : read & write 32 bit GPIO => s0, return to (s3) |
i='h80; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rs, `s1, `s0 }; // s0=(s1) |
i=i+1; ram[i] = { `reg_w, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rh, `s1, `P0 }; // s0=(s1), pop s0 |
i=i+1; ram[i] = { `reg_wh, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
|
// sub : s0=exp2(s0), return to (s7) |
// |
// input is c[31:27].m[26:0] unsigned fixed decimal |
// output is out[31:0] an unsigned 32 bit integer |
// |
// s0 : input, output |
// s1 : running multiply |
// s2 : running root |
// s3 : fudge factor |
// s4 : |
// s5 : |
// s6 : loop index |
// s7 : sub return addr |
// |
// setup |
i='h90; ram[i] = { `flp, `s0, `P0 }; // flp(s0) (to examine lsbs via msb) |
i=i+1; ram[i] = { `psu_i, 6'd31, `s1 }; // s1=0x8000,0000 (starting value = 1) |
i=i+1; ram[i] = { `cpy, `s1, `s2 }; // s2=0x8000,000b (starting root = 2^2^-27) |
i=i+1; ram[i] = { `add_is, 6'hb, `P2 }; // |
i=i+1; ram[i] = { `lit_u, `__, `s3 }; // s3=0x173c,e500 (fudge factor bits) |
i=i+1; ram[i] = 16'he500 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P3 }; // |
i=i+1; ram[i] = 16'h173c ; // |
i=i+1; ram[i] = { `dat_is, 6'd26, `s6 }; // s6=26 (loop index) |
// loop start |
// jump 0 start |
i=i+1; ram[i] = { `jmp_inlz, 6'd2, `s0 }; // (s0[31]==0) ? jump +2 (skip running mult) |
i=i+1; ram[i] = { `mul_xu, `s2, `P1 }; // s1*=s2 |
i=i+1; ram[i] = { `shl_is, 6'd1, `P1 }; // s1<<=1 (so msb=1) |
// jump 0 end |
i=i+1; ram[i] = { `mul_xu, `s2, `P2 }; // s2*=s2 (square to get next root) |
i=i+1; ram[i] = { `shl_is, 6'd1, `P2 }; // s2<<=1 (so msb=1 & lsb=0) |
// jump 1 start |
i=i+1; ram[i] = { `jmp_inlz, 6'd1, `s3 }; // (s3[31]==0) ? jump +1 (no fudge bit) |
i=i+1; ram[i] = { `add_is, 6'd1, `P2 }; // s2++ (set lsb of running root) |
// jump 1 end |
i=i+1; ram[i] = { `shl_is, 6'd1, `P0 }; // s0<<=1 (get next input bit) |
i=i+1; ram[i] = { `shl_is, 6'd1, `P3 }; // s2<<=1 (get next fudge bit) |
i=i+1; ram[i] = { `add_is, -6'd1, `P6 }; // s6-- (loop index--) |
i=i+1; ram[i] = { `jmp_inlz, -6'd11, `s6 }; // (s6>=0) ? jump -11 (loop again) |
// loop end |
// final shift |
i=i+1; ram[i] = { `flp, `s0, `P0 }; // flp(s0) (flip remaining bits) |
i=i+1; ram[i] = { `add_is, -6'd31, `P0 }; // s0-=31 |
i=i+1; ram[i] = { `shl_u, `P0, `P1 }; // s1<<=s0, pop s0 |
// cleanup, return |
i=i+1; ram[i] = { `cpy, `P1, `s0 }; // s0=s1, pop s1 (move) |
i=i+1; ram[i] = { `pop, 8'b01000110 }; // pop s2, s3, s6 |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return, pop s7 |
// end sub |
|
end |
/trunk/v04.05/boot_code/boot_code_defs.h
0,0 → 1,97
localparam MEM_DATA_W = 16; |
localparam IM_W = 6; |
// defines that make programming code more human readable |
`define __ 4'h0 |
`define _0 4'h0 |
`define _1 4'h1 |
`define _2 4'h2 |
`define _3 4'h3 |
`define _4 4'h4 |
`define _5 4'h5 |
`define _6 4'h6 |
`define _7 4'h7 |
`define P0 4'h8 |
`define P1 4'h9 |
`define P2 4'ha |
`define P3 4'hb |
`define P4 4'hc |
`define P5 4'hd |
`define P6 4'he |
`define P7 4'hf |
// |
`define nop op_nop[MEM_DATA_W-1:8] |
`define pop op_pop[MEM_DATA_W-1:8] |
`define pgc op_pgc[MEM_DATA_W-1:8] |
`define lit_s op_lit_s[MEM_DATA_W-1:8] |
`define lit_h op_lit_h[MEM_DATA_W-1:8] |
`define lit_u op_lit_u[MEM_DATA_W-1:8] |
`define reg_rs op_reg_rs[MEM_DATA_W-1:8] |
`define reg_rh op_reg_rh[MEM_DATA_W-1:8] |
`define reg_w op_reg_w[MEM_DATA_W-1:8] |
`define reg_wh op_reg_wh[MEM_DATA_W-1:8] |
// |
`define cpy op_cpy[MEM_DATA_W-1:8] |
`define nsg op_nsg[MEM_DATA_W-1:8] |
`define not op_not[MEM_DATA_W-1:8] |
`define flp op_flp[MEM_DATA_W-1:8] |
`define lzc op_lzc[MEM_DATA_W-1:8] |
`define bra op_bra[MEM_DATA_W-1:8] |
`define bro op_bro[MEM_DATA_W-1:8] |
`define brx op_brx[MEM_DATA_W-1:8] |
`define and op_and[MEM_DATA_W-1:8] |
`define orr op_orr[MEM_DATA_W-1:8] |
`define xor op_xor[MEM_DATA_W-1:8] |
// |
`define add op_add[MEM_DATA_W-1:8] |
`define add_xs op_add_xs[MEM_DATA_W-1:8] |
`define add_xu op_add_xu[MEM_DATA_W-1:8] |
`define sub op_sub[MEM_DATA_W-1:8] |
`define sub_xs op_sub_xs[MEM_DATA_W-1:8] |
`define sub_xu op_sub_xu[MEM_DATA_W-1:8] |
`define mul op_mul[MEM_DATA_W-1:8] |
`define mul_xs op_mul_xs[MEM_DATA_W-1:8] |
`define mul_xu op_mul_xu[MEM_DATA_W-1:8] |
`define shl_s op_shl_s[MEM_DATA_W-1:8] |
`define shl_u op_shl_u[MEM_DATA_W-1:8] |
`define pow op_pow[MEM_DATA_W-1:8] |
// |
`define jmp_z op_jmp_z[MEM_DATA_W-1:8] |
`define jmp_nz op_jmp_nz[MEM_DATA_W-1:8] |
`define jmp_lz op_jmp_lz[MEM_DATA_W-1:8] |
`define jmp_nlz op_jmp_nlz[MEM_DATA_W-1:8] |
`define jmp op_jmp[MEM_DATA_W-1:8] |
`define gto op_gto[MEM_DATA_W-1:8] |
`define gsb op_gsb[MEM_DATA_W-1:8] |
// |
`define mem_irs op_mem_irs[MEM_DATA_W-1:12] |
`define mem_irh op_mem_irh[MEM_DATA_W-1:12] |
`define mem_iw op_mem_iw[MEM_DATA_W-1:12] |
`define mem_iwh op_mem_iwh[MEM_DATA_W-1:12] |
// |
`define jmp_ie op_jmp_ie[MEM_DATA_W-1:12] |
`define jmp_ine op_jmp_ine[MEM_DATA_W-1:12] |
`define jmp_ils op_jmp_ils[MEM_DATA_W-1:12] |
`define jmp_inls op_jmp_inls[MEM_DATA_W-1:12] |
`define jmp_ilu op_jmp_ilu[MEM_DATA_W-1:12] |
`define jmp_inlu op_jmp_inlu[MEM_DATA_W-1:12] |
// |
`define jmp_iz op_jmp_iz[MEM_DATA_W-1:10] |
`define jmp_inz op_jmp_inz[MEM_DATA_W-1:10] |
`define jmp_ilz op_jmp_ilz[MEM_DATA_W-1:10] |
`define jmp_inlz op_jmp_inlz[MEM_DATA_W-1:10] |
// |
`define dat_is op_dat_is[MEM_DATA_W-1:10] |
`define add_is op_add_is[MEM_DATA_W-1:10] |
`define shl_is op_shl_is[MEM_DATA_W-1:10] |
`define psu_i op_psu_i[MEM_DATA_W-1:10] |
// |
`define VER VER_ADDR[IM_W-1:0] |
`define THRD_ID THRD_ID_ADDR[IM_W-1:0] |
`define CLR CLR_ADDR[IM_W-1:0] |
`define INTR_EN INTR_EN_ADDR[IM_W-1:0] |
`define OP_ER OP_ER_ADDR[IM_W-1:0] |
`define STK_ER STK_ER_ADDR[IM_W-1:0] |
`define IO_LO IO_LO_ADDR[IM_W-1:0] |
`define IO_HI IO_HI_ADDR[IM_W-1:0] |
`define UART_RX UART_RX_ADDR[IM_W-1:0] |
`define UART_TX UART_TX_ADDR[IM_W-1:0] |
/trunk/v04.05/boot_code/boot_code_v_ints.h
0,0 → 1,150
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "op_encode.h" |
`include "reg_set_addr.h" |
`include "boot_code_defs.h" |
|
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `__, `__ }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
// Thread 0 : enable interrupts |
// All threads : output thread ID @ interrupt |
|
/////////////// |
// clr space // |
/////////////// |
|
// thread 0 : enable interrupts & loop forever |
i='h0; ram[i] = { `lit_u, `__, `s3 }; // s3='h0100 |
i=i+1; ram[i] = 16'h0100 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
// all others : loop forever |
i='h04; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h08; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h0c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
//////////////// |
// intr space // |
//////////////// |
|
// all threads : read and output thread ID |
i='h20; ram[i] = { `lit_u, `__, `s3 }; // s3='h0110 |
i=i+1; ram[i] = 16'h0110 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
i=i+1; ram[i] = { `gto, `P0, `__ }; // return, pop s0 |
// |
i='h24; ram[i] = { `lit_u, `__, `s3 }; // s3='h0110 |
i=i+1; ram[i] = 16'h0110 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
i=i+1; ram[i] = { `gto, `P0, `__ }; // return, pop s0 |
// |
i='h28; ram[i] = { `lit_u, `__, `s3 }; // s3='h0110 |
i=i+1; ram[i] = 16'h0110 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
i=i+1; ram[i] = { `gto, `P0, `__ }; // return, pop s0 |
// |
i='h2c; ram[i] = { `lit_u, `__, `s3 }; // s3='h0110 |
i=i+1; ram[i] = 16'h0110 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
i=i+1; ram[i] = { `gto, `P0, `__ }; // return, pop s0 |
// |
i='h30; ram[i] = { `lit_u, `__, `s3 }; // s3='h0110 |
i=i+1; ram[i] = 16'h0110 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
i=i+1; ram[i] = { `gto, `P0, `__ }; // return, pop s0 |
// |
i='h34; ram[i] = { `lit_u, `__, `s3 }; // s3='h0110 |
i=i+1; ram[i] = 16'h0110 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
i=i+1; ram[i] = { `gto, `P0, `__ }; // return, pop s0 |
// |
i='h38; ram[i] = { `lit_u, `__, `s3 }; // s3='h0110 |
i=i+1; ram[i] = 16'h0110 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
i=i+1; ram[i] = { `gto, `P0, `__ }; // return, pop s0 |
// |
i='h3c; ram[i] = { `lit_u, `__, `s3 }; // s3='h0110 |
i=i+1; ram[i] = 16'h0110 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
i=i+1; ram[i] = { `gto, `P0, `__ }; // return, pop s0 |
|
|
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
|
|
///////////////// |
// subroutines // |
///////////////// |
|
|
// sub : enable all ints, return to (s3) |
i='h100; ram[i] = { `dat_is, `INTR_EN, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `dat_is, -6'd1, `s0 }; // s0=-1 |
i=i+1; ram[i] = { `reg_w, `P1, `P0 }; // (s1)=s0, pop both |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
// sub : read thread ID & write to GPIO, return to (s3) |
i='h110; ram[i] = { `dat_is, `THRD_ID, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rs, `P1, `s0 }; // s0=(s1), pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_w, `P1, `P0 }; // (s1)=s0, pop both |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
end |
/trunk/v04.05/boot_code/boot_code_log2.h
0,0 → 1,171
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "op_encode.h" |
`include "reg_set_addr.h" |
`include "boot_code_defs.h" |
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `s0, `s0 }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
/* |
------------ |
-- TEST 0 -- |
------------ |
*/ |
|
// Log base 2 |
// Thread 0 : Get input 32 bit GPIO, calculate log2, output 32 bit GPIO. |
// Other threads : do nothing, loop forever |
|
/////////////// |
// clr space // |
/////////////// |
|
i='h0; ram[i] = { `lit_u, `__, `s1 }; // s1=addr |
i=i+1; ram[i] = 16'h0040 ; // |
i=i+1; ram[i] = { `gto, `P1, `__ }; // goto, pop s1 (addr) |
// |
i='h04; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h08; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h0c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
//////////////// |
// intr space // |
//////////////// |
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
// read & write 32 bit GPIO data to & from s0 |
i='h40; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0080 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
// do s0=log2(s0) |
i=i+1; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0090 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s7 }; // gsb, pop s3 (addr) |
// write s0 data to 32 bit GPIO |
i=i+1; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0070 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
// sub : read 32 bit GPIO => s0, return to (s3) |
i='h60; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rs, `P1, `s0 }; // s0=(s1), pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rh, `P1, `P0 }; // s0=(s1), pop both |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
// sub : write s0 => 32 bit GPIO, return to (s3) |
i='h70; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_w, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_wh, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
// sub : read & write 32 bit GPIO => s0, return to (s3) |
i='h80; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rs, `s1, `s0 }; // s0=(s1) |
i=i+1; ram[i] = { `reg_w, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rh, `s1, `P0 }; // s0=(s1), pop s0 |
i=i+1; ram[i] = { `reg_wh, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
|
// sub : s0=log2(s0), return to (s7) |
// |
// input is in[31:0] an unsigned 32 bit integer |
// output is c[31:27].m[26:0] unsigned fixed decimal |
// |
// s0 : input, normalize, square, output |
// s1 : lzc, result |
// s2 : |
// s3 : |
// s4 : |
// s5 : |
// s6 : loop index |
// s7 : sub return address |
// |
// (input=0)? is an error, return |
i='h90; ram[i] = { `jmp_inz, 6'd1, `s0 }; // (s0!=0) ? skip return |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return to (s7), pop s7 |
// normalize |
i=i+1; ram[i] = { `lzc, `s0, `s1 }; // s1=lzc(s0) |
i=i+1; ram[i] = { `shl_s, `s1, `P0 }; // s0<<=s1 (normalize) |
// loop setup |
i=i+1; ram[i] = { `dat_is, 6'd26, `s6 }; // s6=26 (loop index) |
// loop start |
i=i+1; ram[i] = { `mul_xu, `s0, `P0 }; // s0*=s0 |
i=i+1; ram[i] = { `shl_is, 6'd1, `P1 }; // s1<<=1 |
// jump start |
i=i+1; ram[i] = { `jmp_ilz, 6'd2, `s0 }; // (s0[31]==1) ? jump |
i=i+1; ram[i] = { `shl_is, 6'd1, `P0 }; // s0<<=1 |
i=i+1; ram[i] = { `add_is, 6'd1, `P1 }; // s1++ |
// jump end |
i=i+1; ram[i] = { `add_is, -6'd1, `P6 }; // s6-- |
i=i+1; ram[i] = { `jmp_inlz, -6'd7, `s6 }; // (s6>=0) ? do again |
// loop end |
// cleanup, return |
i=i+1; ram[i] = { `not, `P1, `P0 }; // s0=~s1, pop both |
i=i+1; ram[i] = { `gto, `P7, `P6 }; // return, pop s7 & s6 |
// end sub |
|
end |
/trunk/v04.05/boot_code/boot_code_divide.h
0,0 → 1,176
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "op_encode.h" |
`include "reg_set_addr.h" |
`include "boot_code_defs.h" |
|
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `s0, `s0 }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
/* |
------------ |
-- TEST 0 -- |
------------ |
*/ |
|
// Divide - both inputs positive. |
// Thread 0 : Get input 32 bit GPIO 2x, divide, output 32 bit GPIO 2x. |
// Other threads : do nothing, loop forever |
|
/////////////// |
// clr space // |
/////////////// |
|
i='h0; ram[i] = { `lit_u, `__, `s1 }; // s1=addr |
i=i+1; ram[i] = 16'h0040 ; // |
i=i+1; ram[i] = { `gto, `P1, `__ }; // goto, pop s1 (addr) |
// |
i='h04; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h08; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h0c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
//////////////// |
// intr space // |
//////////////// |
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
// read & write 32 bit GPIO data to & from s0 2x |
i='h40; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0080 ; // |
i=i+1; ram[i] = { `gsb, `s3, `s3 }; // gsb |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
// do s0/s1 |
i=i+1; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0090 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s7 }; // gsb, pop s3 (addr) |
// write s0 data to 32 bit GPIO 2x |
i=i+1; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0070 ; // |
i=i+1; ram[i] = { `gsb, `s3, `s3 }; // gsb |
i=i+1; ram[i] = { `pop, 8'b00000001 }; // pop s0 |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
// sub : read 32 bit GPIO => s0, return to (s3) |
i='h60; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rs, `P1, `s0 }; // s0=(s1), pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rh, `P1, `P0 }; // s0=(s1), pop both |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
// sub : write s0 => 32 bit GPIO, return to (s3) |
i='h70; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_w, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_wh, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
// sub : read & write 32 bit GPIO => s0, return to (s3) |
i='h80; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rs, `s1, `s0 }; // s0=(s1) |
i=i+1; ram[i] = { `reg_w, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rh, `s1, `P0 }; // s0=(s1), pop s0 |
i=i+1; ram[i] = { `reg_wh, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
// sub : unsigned divide & modulo remainder, return to (s7) |
// |
// algorithm: binary search |
// |
// s0 : N, D(top)/N(under) input, Q(top)/R(under) output |
// s1 : D |
// s2 : Q |
// s3 : |
// s4 : |
// s5 : |
// s6 : one-hot (& loop test) |
// s7 : sub return address |
// |
// (D=0)? is an error, return |
i='h90; ram[i] = { `jmp_inz, 6'd1, `s0 }; // (s0!=0) ? skip return |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return to (s7), pop s7 |
// loop setup |
i=i+1; ram[i] = { `cpy, `P0, `s1 }; // s0=>s1 (s1=D, s0=N) |
i=i+1; ram[i] = { `dat_is, 6'd0, `s2 }; // s2=0 (s2=init Q) |
i=i+1; ram[i] = { `lzc, `s1, `s6 }; // s6=lzc(s1) |
i=i+1; ram[i] = { `pow, `s6, `P6 }; // s6=1<<s6, pop s6 (s6=init OH) |
// loop start |
i=i+1; ram[i] = { `add, `s6, `P2 }; // s2+=s6 (s2=new trial Q) |
i=i+1; ram[i] = { `mul, `s2, `s1 }; // s1=s1*s2 (s1=D*Q) |
// jump start |
i=i+1; ram[i] = { `jmp_inlu, 4'd1, `P1, `s0 }; // (s0>=s1) ? skip restore, pop s1 (N>=D*Q) |
i=i+1; ram[i] = { `sub, `s6, `P2 }; // s2-=s6 (s2=restored Q) |
// jump end |
i=i+1; ram[i] = { `psu_i, -6'd1, `P6 }; // s6>>=1 (new OH) |
i=i+1; ram[i] = { `jmp_inz, -6'd6, `s6 }; // (s6!=0) ? do again |
// loop end |
// calc remainder, move Q |
i=i+1; ram[i] = { `mul, `s2, `P1 }; // s1*=s2 (s1=D*Q) |
i=i+1; ram[i] = { `sub, `P1, `P0 }; // s0-=s1, pop both (s0=N-D*Q=R) |
i=i+1; ram[i] = { `cpy, `P2, `s0 }; // s0=s2, pop s2 (s0=Q) |
// return |
i=i+1; ram[i] = { `gto, `P7, `P6 }; // return to (s7), pop s7 & s6 |
// end sub |
|
|
end |
/trunk/v04.05/boot_code/boot_code_v_alu.h
0,0 → 1,514
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "op_encode.h" |
`include "reg_set_addr.h" |
`include "boot_code_defs.h" |
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `__, `__ }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
// Thread 0 : test ALU logical functions |
// Thread 1 : test ALU arithmetic functions |
// Thread 2 : test ALU shift functions |
// All other threads : loop forever |
|
/////////////// |
// clr space // |
/////////////// |
|
// thread 0 |
i='h00; ram[i] = { `lit_u, `__, `s2 }; // s2=dat |
i=i+1; ram[i] = 16'h0100 ; // addr |
i=i+1; ram[i] = { `gto, `P2, `__ }; // goto, pop s2 (addr) |
// thread 1 |
i='h04; ram[i] = { `lit_u, `__, `s2 }; // s2=dat |
i=i+1; ram[i] = 16'h0200 ; // addr |
i=i+1; ram[i] = { `gto, `P2, `__ }; // goto, pop s2 (addr) |
// thread 2 |
i='h08; ram[i] = { `lit_u, `__, `s2 }; // s2=dat |
i=i+1; ram[i] = 16'h0300 ; // addr |
i=i+1; ram[i] = { `gto, `P2, `__ }; // goto, pop s2 (addr) |
// and the rest (are here on Gilligan's Isle) |
i='h0c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
//////////////// |
// intr space // |
//////////////// |
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
|
// test ALU logical functions, result in s0 |
// Correct functioning is s0 = 'd14 ('he). |
// |
// s0 : final test result |
// s1 : test value |
// s2 : test value |
// s3 : running test result, subroutine return address |
// |
// setup running test result: |
i='h100; ram[i] = { `dat_is, 6'd0, `s3 }; // s3=0 |
// load s1 & s2 values |
i=i+1; ram[i] = { `dat_is, 6'd1, `s1 }; // s1=1 |
i=i+1; ram[i] = { `dat_is, -6'd1, `s2 }; // s2=-1 |
// BRA ( &(1)= 0; &(-1)=-1 ) |
i=i+1; ram[i] = { `bra, `s1, `s0 }; // s0=&s1 |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P0 }; // (s0==0) ? skip, pop s0 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `bra, `s2, `s0 }; // s0=&s2 |
i=i+1; ram[i] = { `jmp_inz, 6'd1, `P0 }; // (s0!=0) ? skip, pop s0 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// BRO ( |(1)=-1; |(-1)=-1 ) |
i=i+1; ram[i] = { `bro, `s1, `s0 }; // s0=|s1 |
i=i+1; ram[i] = { `jmp_inz, 6'd1, `P0 }; // (s0!=0) ? skip, pop s0 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `bro, `s2, `s0 }; // s0=|s2 |
i=i+1; ram[i] = { `jmp_inz, 6'd1, `P0 }; // (s0!=0) ? skip, pop s0 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// BRX ( ^(1)=-1; ^(-1)=0 ) |
i=i+1; ram[i] = { `brx, `s1, `s0 }; // s0=^s1 |
i=i+1; ram[i] = { `jmp_inz, 6'd1, `P0 }; // (s0!=0) ? skip, pop s0 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `brx, `s2, `s0 }; // s0=^s2 |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P0 }; // (s0==0) ? skip, pop s0 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// clean up |
i=i+1; ram[i] = { `pop, 8'b00000110 }; // pop s2 & s1 |
// load s1 & s2 values |
i=i+1; ram[i] = { `lit_u, `__, `s1 }; // s1='h36c9,a53c |
i=i+1; ram[i] = 16'ha53c ; // |
i=i+1; ram[i] = { `lit_h, `__, `P1 }; // |
i=i+1; ram[i] = 16'h36c9 ; // |
// |
i=i+1; ram[i] = { `lit_u, `__, `s2 }; // s2='h5ca3,c396 |
i=i+1; ram[i] = 16'hc396 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P2 }; // |
i=i+1; ram[i] = 16'h5ca3 ; // |
// AND (s/b 'h1481,8114) |
i=i+1; ram[i] = { `and, `s2, `s1 }; // s1=s1&s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h1481,8114 |
i=i+1; ram[i] = 16'h8114 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h1481 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// OR (s/b 'h7eeb,e7be) |
i=i+1; ram[i] = { `orr, `s2, `s1 }; // s1=s1|s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h7eeb,e7be |
i=i+1; ram[i] = 16'he7be ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h7eeb ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// XOR (s/b 'h6a6a,66aa) |
i=i+1; ram[i] = { `xor, `s2, `s1 }; // s1=s1^s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h6a6a,66aa |
i=i+1; ram[i] = 16'h66aa ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h6a6a ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// NOT (s/b 'hc936,5ac3) |
i=i+1; ram[i] = { `not, `s1, `s1 }; // s1=~s1 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='hc936,5ac3 |
i=i+1; ram[i] = 16'h5ac3 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'hc936 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// FLP (s/b 'h3ca5,936c) |
i=i+1; ram[i] = { `flp, `s1, `s1 }; // s1=flip(s1) |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h3ca5,936c |
i=i+1; ram[i] = 16'h936c ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h3ca5 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// LZC (s/b 'h0000,0002) |
i=i+1; ram[i] = { `lzc, `s1, `s1 }; // s1=lzc(s1) |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h0000,0002 |
i=i+1; ram[i] = 16'h0002 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h0000 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no opcode errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0900 |
i=i+1; ram[i] = 16'h0900 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0910 |
i=i+1; ram[i] = 16'h0910 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// copy result to s0 |
i=i+1; ram[i] = { `cpy, `P3, `s0 }; // s0=s3, pop s3 |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
// test ALU arithmetic functions, result in s0 |
// Correct functioning is s0 = 'd13 ('hd). |
// |
// s0 : final test result |
// s1 : test value |
// s2 : test value |
// s3 : running test result, subroutine return address |
// |
// setup running test result: |
i='h200; ram[i] = { `dat_is, 6'd0, `s3 }; // s3=0 |
// load s1 & s2 values |
i=i+1; ram[i] = { `lit_u, `__, `s1 }; // s1='ha53c,36c9 |
i=i+1; ram[i] = 16'h36c9 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P1 }; // |
i=i+1; ram[i] = 16'ha53c ; // |
// |
i=i+1; ram[i] = { `lit_u, `__, `s2 }; // s2='h5ca3,c396 |
i=i+1; ram[i] = 16'hc396 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P2 }; // |
i=i+1; ram[i] = 16'h5ca3 ; // |
// ADD_I -32 (s/b 'ha53c,36a9) |
i=i+1; ram[i] = { `add_is, -6'd32, `s1 }; // s1=s1-32 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='ha53c,36a9 |
i=i+1; ram[i] = 16'h36a9 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'ha53c ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// ADD_I +31 (s/b 'ha53c,36e8) |
i=i+1; ram[i] = { `add_is, 6'd31, `s1 }; // s1=s1+31 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='ha53c,36e8 |
i=i+1; ram[i] = 16'h36e8 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'ha53c ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// ADD (s/b 'h01df,fa5f) |
i=i+1; ram[i] = { `add, `s2, `s1 }; // s1=s1+s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h01df,fa5f |
i=i+1; ram[i] = 16'hfa5f ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h01df ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// ADD_XS (s/b 0) |
i=i+1; ram[i] = { `add_xs, `s2, `s1 }; // s1=s1+s2 |
i=i+1; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// ADD_XU (s/b 1) |
i=i+1; ram[i] = { `add_xu, `s2, `s1 }; // s1=s1+s2 |
i=i+1; ram[i] = { `dat_is, 6'd1, `s0 }; // s0=1 |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// SUB (s/b 'h4898,7333) |
i=i+1; ram[i] = { `sub, `s2, `s1 }; // s1=s1-s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h4898,7333 |
i=i+1; ram[i] = 16'h7333 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h4898 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// SUB_XS (s/b -1) |
i=i+1; ram[i] = { `sub_xs, `s2, `s1 }; // s1=s1-s2 |
i=i+1; ram[i] = { `dat_is, -6'd1, `s0 }; // s0=-1 |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// SUB_XU (s/b 0) |
i=i+1; ram[i] = { `sub_xu, `s2, `s1 }; // s1=s1-s2 |
i=i+1; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// MUL (s/b 'hccfe,34c6) |
i=i+1; ram[i] = { `mul, `s2, `s1 }; // s1=s1*s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='hccfe,34c6 |
i=i+1; ram[i] = 16'h34c6 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'hccfe ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// MUL_XS (s/b 'hdf27,93ae) |
i=i+1; ram[i] = { `mul_xs, `s2, `s1 }; // s1=s1*s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='hdf27,93ae |
i=i+1; ram[i] = 16'h93ae ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'hdf27 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// MUL_XU (s/b 'h3bcb,5744) |
i=i+1; ram[i] = { `mul_xu, `s2, `s1 }; // s1=s1*s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h3bcb,5744 |
i=i+1; ram[i] = 16'h5744 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h3bcb ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no opcode errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0900 |
i=i+1; ram[i] = 16'h0900 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0910 |
i=i+1; ram[i] = 16'h0910 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// copy result to s0 |
i=i+1; ram[i] = { `cpy, `P3, `s0 }; // s0=s3, pop s3 |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
// test ALU shift functions, result in s0 |
// Correct functioning is s0 = 'd12 ('hc). |
// |
// s0 : final test result |
// s1 : test value |
// s2 : test value |
// s3 : running test result, subroutine return address |
// |
// setup running test result: |
i='h300; ram[i] = { `dat_is, 6'd0, `s3 }; // s3=0 |
// load s1 test value |
i=i+1; ram[i] = { `lit_u, `__, `s1 }; // s1='ha53c,36c9 |
i=i+1; ram[i] = 16'h36c9 ; // hi data |
i=i+1; ram[i] = { `lit_h, `__, `P1 }; // lit => s1, pop combine |
i=i+1; ram[i] = 16'ha53c ; // lo data |
// SHL_IS -28 (s/b 'hffff,fffa) |
i=i+1; ram[i] = { `shl_is, -6'd28, `s1 }; // s1>>=28 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='hffff,fffa |
i=i+1; ram[i] = 16'hfffa ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'hffff ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// SHL_IS +28 (s/b 'h9000,0000) |
i=i+1; ram[i] = { `shl_is, 6'd28, `s1 }; // s1<<=28 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h9000,0000 |
i=i+1; ram[i] = 16'h0000 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h9000 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// PSU_I -28 (s/b 'h0000,000a) |
i=i+1; ram[i] = { `psu_i, -6'd28, `s1 }; // s1>>=28 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h0000,000a |
i=i+1; ram[i] = 16'h000a ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h0000 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// PSU_I +28 (s/b 'h1000,0000) |
i=i+1; ram[i] = { `psu_i, 6'd28, `s1 }; // s1=1<<28 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h1000,0000 |
i=i+1; ram[i] = 16'h0000 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h1000 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// SHL_S -4 (s/b 'hfa53,c36c) |
i=i+1; ram[i] = { `dat_is, -6'd4, `s2 }; // s2=-4 |
i=i+1; ram[i] = { `shl_s, `P2, `s1 }; // s1<<=s2, pop s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='hfa53,c36c |
i=i+1; ram[i] = 16'hc36c ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'hfa53 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// SHL_S +4 (s/b 'h53c3,6c90) |
i=i+1; ram[i] = { `dat_is, 6'd4, `s2 }; // s2=4 |
i=i+1; ram[i] = { `shl_s, `P2, `s1 }; // s1<<=s2, pop s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h53c3,6c90 |
i=i+1; ram[i] = 16'h6c90 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h53c3 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// SHL_U -4 (s/b 'h0a53,c36c) |
i=i+1; ram[i] = { `dat_is, -6'd4, `s2 }; // s2=-4 |
i=i+1; ram[i] = { `shl_u, `P2, `s1 }; // s1<<=s2, pop s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h0a53,c36c |
i=i+1; ram[i] = 16'hc36c ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h0a53 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// SHL_U +4 (s/b 'h53c3,6c90) |
i=i+1; ram[i] = { `dat_is, 6'd4, `s2 }; // s2=4 |
i=i+1; ram[i] = { `shl_u, `P2, `s1 }; // s1<<=s2, pop s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h53c3,6c90 |
i=i+1; ram[i] = 16'h6c90 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h53c3 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// POW -4 (s/b 'h1000,0000) |
i=i+1; ram[i] = { `dat_is, -6'd4, `s2 }; // s2=-4 |
i=i+1; ram[i] = { `pow, `P2, `s1 }; // s1=1<<s2, pop s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h0000,0000 |
i=i+1; ram[i] = 16'h0000 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h1000 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// POW +4 (s/b 'h0000,0010) |
i=i+1; ram[i] = { `dat_is, 6'd4, `s2 }; // s2=4 |
i=i+1; ram[i] = { `pow, `P2, `s1 }; // s1=1<<s2, pop s2 |
i=i+1; ram[i] = { `lit_u, `__, `s0 }; // s0='h0000,0010 |
i=i+1; ram[i] = 16'h0010 ; // |
i=i+1; ram[i] = { `lit_h, `__, `P0 }; // |
i=i+1; ram[i] = 16'h0000 ; // |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `P1, `P0 }; // (s0==s1) ? skip, pop both |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no opcode errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0900 |
i=i+1; ram[i] = 16'h0900 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0910 |
i=i+1; ram[i] = 16'h0910 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// copy result to s0 |
i=i+1; ram[i] = { `cpy, `P3, `s0 }; // s0=s3, pop s3 |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
|
|
///////////////// |
// subroutines // |
///////////////// |
|
|
// sub : read & clear opcode errors for this thread => s4, return to (s7) |
// avoid the use of s1! |
i='h900; ram[i] = { `dat_is, `THRD_ID, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `P6, `s5 }; // s5=(s6), pop s6 |
i=i+1; ram[i] = { `pow, `P5, `s4 }; // s4=1<<s5, pop s5 |
i=i+1; ram[i] = { `dat_is, `OP_ER, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `s6, `s5 }; // s5=(s6) |
i=i+1; ram[i] = { `and, `P5, `P4 }; // s4&=s5, pop s5 |
i=i+1; ram[i] = { `reg_w, `P6, `s4 }; // (s6)=s4, pop s6 |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return to (s7), pop s7 |
|
|
// sub : read & clear stack errors for this thread => s4, return to (s7) |
// avoid the use of s1! |
i='h910; ram[i] = { `dat_is, `THRD_ID, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `P6, `s5 }; // s5=(s6), pop s6 |
i=i+1; ram[i] = { `pow, `P5, `s4 }; // s4=1<<s5, pop s5 |
i=i+1; ram[i] = { `cpy, `s4, `s5 }; // s5=s4 |
i=i+1; ram[i] = { `shl_is, 6'd8, `P5 }; // s5<<=8 |
i=i+1; ram[i] = { `orr, `P5, `P4 }; // s4|=s5, pop s5 |
i=i+1; ram[i] = { `dat_is, `STK_ER, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `s6, `s5 }; // s5=(s6) |
i=i+1; ram[i] = { `and, `P5, `P4 }; // s4&=s5, pop s5 |
i=i+1; ram[i] = { `reg_w, `P6, `s4 }; // (s6)=s4, pop s6 |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return to (s7), pop s7 |
|
|
end |
/trunk/v04.05/boot_code/boot_code_led_pwm.h
0,0 → 1,172
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "boot_code_defs.h" |
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `__, `__ }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
// Thread 0 : do LED PWM action |
// All other threads : loop forever |
|
/////////////// |
// clr space // |
/////////////// |
|
// thread 0 |
i='h00; ram[i] = { `lit_u, `__, `s2 }; // s2=dat |
i=i+1; ram[i] = 16'h0100 ; // addr |
i=i+1; ram[i] = { `gto, `P2, `__ }; // goto, pop s2 (addr) |
// and the rest |
i='h04; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h08; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h0c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
//////////////// |
// intr space // |
//////////////// |
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
/* |
// simple binary count LED display |
i='h100; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
// loop start |
i=i+1; ram[i] = { `add_is, 6'd1, `P0 }; // s0++ |
i=i+1; ram[i] = { `psu_i, -6'd20, `s0 }; // s0=s0>>20 |
i=i+1; ram[i] = { `reg_w, `s1, `P0 }; // (s1)=s0, pop s0 |
i=i+1; ram[i] = { `jmp_ie, -4'd4, `s0, `s0 }; // loop forever |
// loop end |
*/ |
|
/* |
// simple sequential LED display |
i='h100; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
// loop start |
i=i+1; ram[i] = { `add_is, 6'd1, `P0 }; // s0++ |
i=i+1; ram[i] = { `shl_is, 6'd10, `s0 }; // s0=s0<<10 |
i=i+1; ram[i] = { `psu_i, -6'd30, `P0 }; // s0=s0>>30, pop s0 |
i=i+1; ram[i] = { `pow, `P0, `s0 }; // s0=1<<s0, pop s0 |
i=i+1; ram[i] = { `reg_w, `s1, `P0 }; // (s1)=s0, pop s0 |
i=i+1; ram[i] = { `jmp_ie, -4'd6, `s0, `s0 }; // loop forever |
// loop end |
*/ |
|
/* |
// sequential LED display w/ PWM - moving "dark spot" |
i='h100; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `dat_is, 6'd0, `s2 }; // s2=pwm |
// loop start |
i=i+1; ram[i] = { `shl_is, 6'd13, `s0 }; // s0=s0<<13 - isolate decimal |
i=i+1; ram[i] = { `add, `P0, `P2 }; // s2+=s0, pop s0 - add to pwm counter |
i=i+1; ram[i] = { `add_is, 6'd1, `P0 }; // s0++ - get next value |
i=i+1; ram[i] = { `shl_is, 6'd13, `s0 }; // s0=s0<<13 - isolate decimal |
i=i+1; ram[i] = { `add_xu, `P0, `s2 }; // s2=s2+s0, pop s0 - see if it will cause pwm counter overflow |
i=i+1; ram[i] = { `shl_is, 6'd19, `P2 }; // s2<<=19 - shift up to ones place |
i=i+1; ram[i] = { `add, `P2, `s0 }; // s0+=s2, pop s2 - add pwm bit |
i=i+1; ram[i] = { `shl_is, 6'd11, `P0 }; // s0<<=11 - isolate integer |
i=i+1; ram[i] = { `psu_i, -6'd30, `P0 }; // s0>>=30 |
i=i+1; ram[i] = { `pow, `s0, `P0 }; // s0=1<<s0, pop s0 - do one hot |
i=i+1; ram[i] = { `not, `s0, `P0 }; // s0~=s0 - invert |
i=i+1; ram[i] = { `reg_w, `s1, `P0 }; // (s1)=s0, pop s0 |
i=i+1; ram[i] = { `jmp_inz, -6'd13, `s1 }; // loop forever |
// loop end |
*/ |
|
// "bouncing ball" 4 LED display w/ PWM |
// |
// s0 : sin |
// s1 : cos |
// s2 : alpha (attenuation factor = speed) |
// s3 : rectified sin, val, one-hot(val) |
// s4 : |
// s5 : pwm counter |
// s6 : |
// s7 : i/o register address |
|
i='h100; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 (sin init) |
i=i+1; ram[i] = { `lit_u, `__, `s1 }; // s1=0x3000,0000 (cos init) |
i=i+1; ram[i] = 16'h3000 ; // |
i=i+1; ram[i] = { `shl_is, 6'd16, `P1 }; // |
i=i+1; ram[i] = { `lit_u, `__, `s2 }; // s2=0x3000 (alpha init) |
i=i+1; ram[i] = 16'h3000 ; // |
i=i+1; ram[i] = { `dat_is, 6'd0, `s5 }; // s5=0 (pwm init) |
i=i+1; ram[i] = { `dat_is, `IO_LO, `s7 }; // s7=reg addr |
// loop start |
// sin & cos |
i=i+1; ram[i] = { `mul_xs, `s2, `s0 }; // s0=s0*s2 (sin*alpha) |
i=i+1; ram[i] = { `sub, `P0, `P1 }; // s1-=s0 (cos-=sin*alpha) |
i=i+1; ram[i] = { `mul_xs, `s2, `s1 }; // s1=s1*s2 (cos*alpha) |
i=i+1; ram[i] = { `add, `P1, `P0 }; // s0-=s1 (sin+=cos*alpha) |
// |sin| |
i=i+1; ram[i] = { `cpy, `s0, `s3 }; // s3=s0 |
i=i+1; ram[i] = { `jmp_inlz, 6'd1, `s3 }; // (s3!<0) ? jmp +1 |
i=i+1; ram[i] = { `not, `s3, `P3 }; // s3~=s3 |
// decimal( |sin| ) + pwm to update, + pwm to get ofl |
i=i+1; ram[i] = { `shl_is, 6'd4, `s3 }; // s3=s3<<4 |
i=i+1; ram[i] = { `add, `s3, `P5 }; // s5+=s3 (update pwm count) |
i=i+1; ram[i] = { `add_xu, `P3, `s5 }; // s5=s5+s3, pop s3 (get pwm ofl) |
// one-hot( int( |sin| ) + pwm ofl ) |
i=i+1; ram[i] = { `shl_is, -6'd28, `P3 }; // s3>>=28 |
i=i+1; ram[i] = { `add, `P5, `P3 }; // s3+=s5, pop s5 (add pwm ofl) |
i=i+1; ram[i] = { `pow, `s3, `P3 }; // s3=1<<s3, pop s3 (one-hot) |
// output |
i=i+1; ram[i] = { `reg_w, `s7, `P3 }; // (s7)=s3, pop s3 |
i=i+1; ram[i] = { `jmp_inz, -6'd15, `s7 }; // loop forever |
// loop end |
|
end |
/trunk/v04.05/boot_code/boot_code_sqrt.h
0,0 → 1,172
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "op_encode.h" |
`include "reg_set_addr.h" |
`include "boot_code_defs.h" |
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `s0, `s0 }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
/* |
------------ |
-- TEST 0 -- |
------------ |
*/ |
|
// Square root |
// Thread 0 : Get input 32 bit GPIO, calculate square root, output 32 bit GPIO. |
// Other threads : do nothing, loop forever |
|
/////////////// |
// clr space // |
/////////////// |
|
i='h0; ram[i] = { `lit_u, `__, `s1 }; // s1=addr |
i=i+1; ram[i] = 16'h0040 ; // |
i=i+1; ram[i] = { `gto, `P1, `__ }; // goto, pop s1 (addr) |
// |
i='h04; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h08; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h0c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
//////////////// |
// intr space // |
//////////////// |
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
// read & write 32 bit GPIO data to & from s0 |
i='h40; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0080 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
// do s0=sqrt(s0) |
i=i+1; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0090 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s7 }; // gsb, pop s3 (addr) |
// write s0 data to 32 bit GPIO |
i=i+1; ram[i] = { `lit_u, `__, `s3 }; // s3=addr |
i=i+1; ram[i] = 16'h0070 ; // |
i=i+1; ram[i] = { `gsb, `P3, `s3 }; // gsb, pop s3 (addr) |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
// sub : read 32 bit GPIO => s0, return to (s3) |
i='h60; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rs, `P1, `s0 }; // s0=(s1), pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rh, `P1, `P0 }; // s0=(s1), pop both |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
// sub : write s0 => 32 bit GPIO, return to (s3) |
i='h70; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_w, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_wh, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
// sub : read & write 32 bit GPIO => s0, return to (s3) |
i='h80; ram[i] = { `dat_is, `IO_LO, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rs, `s1, `s0 }; // s0=(s1) |
i=i+1; ram[i] = { `reg_w, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `dat_is, `IO_HI, `s1 }; // s1=reg addr |
i=i+1; ram[i] = { `reg_rh, `s1, `P0 }; // s0=(s1), pop s0 |
i=i+1; ram[i] = { `reg_wh, `P1, `s0 }; // (s1)=s0, pop s1 |
i=i+1; ram[i] = { `gto, `P3, `__ }; // return, pop s3 |
|
|
// sub : s0=sqrt(s0), return to (s7) |
// |
// input is unsigned 32 integer |
// output is unsigned 16.16 integer |
// |
// algorithm: binary search |
// iterate 32 times |
// |
// s0 : input (x), output (Q) |
// s1 : running q |
// s2 : temp: q^2 + q |
// s3 : |
// s4 : |
// s5 : |
// s6 : one-hot (& loop test) |
// s7 : sub return address |
// |
// loop setup |
i='h90; ram[i] = { `dat_is, 6'd0, `s1 }; // s1=0 (init Q) |
i=i+1; ram[i] = { `psu_i, 6'd31, `s6 }; // s6 MSB=1 (init OH) |
// loop start |
i=i+1; ram[i] = { `add, `s6, `P1 }; // s1+=s6 |
i=i+1; ram[i] = { `mul_xu, `s1, `s1 }; // s1=s1*s1 (square, integer portion) |
// jump start |
i=i+1; ram[i] = { `jmp_ilu, 4'd1, `s0, `P1 }; // (s1<s0) ? jump 1 pop s1 (skip restore) |
i=i+1; ram[i] = { `sub, `s6, `P1 }; // s1-=s6 (restore) |
// jump end |
i=i+1; ram[i] = { `psu_i, -6'd1, `P6 }; // s6>>=1 (new OH) |
i=i+1; ram[i] = { `jmp_inz, -6'd6, `s6 }; // (s6!=0) ? do again |
// loop end |
i=i+1; ram[i] = { `mul_xu, `s1, `s1 }; // s1=s1*s1 (square, integer portion) |
i=i+1; ram[i] = { `sub, `P1, `P0 }; // s0-=s1, pop s1 : x -= q^2 |
i=i+1; ram[i] = { `add, `s1, `P0 }; // s0+=s1 : Q = q + x - q^2 |
i=i+1; ram[i] = { `mul, `s1, `s1 }; // s1=s1*s1 (square, decimal portion) : (q>>n)^2 |
i=i+1; ram[i] = { `cpy, `P1, `s2 }; // s2=s1, move |
i=i+1; ram[i] = { `add_xu, `P1, `P2 }; // s2+=s1 (carry out, integer portion), pop s1 : int[q>>n + (q>>n)^2] |
i=i+1; ram[i] = { `sub, `P2, `P0 }; // s0+=s2, pop s2 : Q = q + (x - q^2) - int[q>>n + (q>>n)^2] |
i=i+1; ram[i] = { `gto, `P7, `P6 }; // return, pop s7 & s6 |
// end sub |
|
end |
/trunk/v04.05/boot_code/boot_code_v_branches.h
0,0 → 1,584
/* |
-------------------------------------------------------------------------------- |
|
Module : boot_code.h |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Boot code for a processor core. |
|
Instantiates: |
- Nothing. |
|
Notes: |
- For testing (@ core.v): |
CLR_BASE = 'h0; |
CLR_SPAN = 2; // gives 4 instructions |
INTR_BASE = 'h20; // 'd32 |
INTR_SPAN = 2; // gives 4 instructions |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
/* |
-------------------- |
-- external stuff -- |
-------------------- |
*/ |
`include "op_encode.h" |
`include "reg_set_addr.h" |
`include "boot_code_defs.h" |
|
/* |
---------------------------------------- |
-- initialize: fill with default data -- |
---------------------------------------- |
*/ |
integer i; |
|
initial begin |
|
/* // fill with nop (some compilers need this) |
for ( i = 0; i < CAPACITY; i = i+1 ) begin |
ram[i] = { `nop, `__, `__ }; |
end |
*/ |
|
/* |
--------------- |
-- boot code -- |
--------------- |
*/ |
|
|
// Thread 0 : test all jmp_i (A?B) instructions |
// Thread 1 : test all jmp_i (A?0) instructions |
// Thread 2 : test all jmp instructions |
// Thread 3 : test all gto instructions |
// Other threads : do nothing, loop forever |
|
/////////////// |
// clr space // |
/////////////// |
|
i='h0; ram[i] = { `lit_u, `__, `s1 }; // s1=addr |
i=i+1; ram[i] = 16'h0200 ; // |
i=i+1; ram[i] = { `gto, `P1, `__ }; // goto, pop s1 (addr) |
// |
i='h4; ram[i] = { `lit_u, `__, `s1 }; // s1=addr |
i=i+1; ram[i] = 16'h0400 ; // |
i=i+1; ram[i] = { `gto, `P1, `__ }; // goto, pop s1 (addr) |
// |
i='h8; ram[i] = { `lit_u, `__, `s1 }; // s1=addr |
i=i+1; ram[i] = 16'h0500 ; // |
i=i+1; ram[i] = { `gto, `P1, `__ }; // goto, pop s1 (addr) |
// |
i='hc; ram[i] = { `lit_u, `__, `s1 }; // s1=addr |
i=i+1; ram[i] = 16'h0600 ; // |
i=i+1; ram[i] = { `gto, `P1, `__ }; // goto, pop s1 (addr) |
// |
i='h10; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h14; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h18; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
i='h1c; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
//////////////// |
// intr space // |
//////////////// |
|
|
/////////////////////// |
// code & data space // |
/////////////////////// |
|
|
///////////////// |
// subroutines // |
///////////////// |
|
|
// test all jmp_i (A?B) instructions, result in s0. |
// Correct functioning is s0 = 'd58 ('h3A). |
// |
// s0 : 0 & final test result |
// s1 : +1 |
// s2 : -2 |
// s3 : running test result |
// |
// setup test values and running test result: |
i='h200; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `dat_is, 6'd1, `s1 }; // s1=1 |
i=i+1; ram[i] = { `dat_is, -6'd2, `s2 }; // s2=-2 |
i=i+1; ram[i] = { `dat_is, 6'd0, `s3 }; // s3=0 |
// |
// distance testing |
// |
i=i+1; ram[i] = { `jmp_ie, 4'd7, `s0, `s0 }; // jump forward |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // (+0,-9) s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // (+1,-8) s3++ (backward jump lands here) |
i=i+1; ram[i] = { `jmp_ie, 4'd6, `s0, `s0 }; // (+2,-7) jump forward (and out) |
// 3 don't cares here |
i=i+4; ram[i] = { `add_is, -6'd1, `P3 }; // (+6,-3) s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // (+7,-2) s3++ (forward jump lands here) |
i=i+1; ram[i] = { `jmp_ie, -4'd8, `s0, `s0 }; // (+8,-1) jump back |
// |
// (A?B) testing |
// |
// ie |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `s0, `s0 }; // (s0==s0) ? jump (YNN) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `s0, `s1 }; // (s1==s0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `s0, `s2 }; // (s2==s0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `s1, `s0 }; // (s0==s1) ? jump (NYN) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `s1, `s1 }; // (s1==s1) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `s1, `s2 }; // (s2==s1) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `s2, `s0 }; // (s0==s2) ? jump (NNY) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `s2, `s1 }; // (s1==s2) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ie, 4'd1, `s2, `s2 }; // (s2==s2) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// ine |
i=i+1; ram[i] = { `jmp_ine, 4'd1, `s0, `s0 }; // (s0!=s0) ? jump (NYY) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ine, 4'd1, `s0, `s1 }; // (s1!=s0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_ine, 4'd1, `s0, `s2 }; // (s2!=s0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `jmp_ine, 4'd1, `s1, `s0 }; // (s0!=s1) ? jump (YNY) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_ine, 4'd1, `s1, `s1 }; // (s1!=s1) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ine, 4'd1, `s1, `s2 }; // (s2!=s1) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `jmp_ine, 4'd1, `s2, `s0 }; // (s0!=s2) ? jump (YYN) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_ine, 4'd1, `s2, `s1 }; // (s1!=s2) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_ine, 4'd1, `s2, `s2 }; // (s2!=s2) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// ilu |
i=i+1; ram[i] = { `jmp_ilu, 4'd1, `s0, `s0 }; // (s0<s0) ? jump (NNN) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ilu, 4'd1, `s0, `s1 }; // (s1<s0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ilu, 4'd1, `s0, `s2 }; // (s2<s0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// |
i=i+1; ram[i] = { `jmp_ilu, 4'd1, `s1, `s0 }; // (s0<s1) ? jump (YNN) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_ilu, 4'd1, `s1, `s1 }; // (s1<s1) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ilu, 4'd1, `s1, `s2 }; // (s2<s1) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// |
i=i+1; ram[i] = { `jmp_ilu, 4'd1, `s2, `s0 }; // (s0<s2) ? jump (YYN) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_ilu, 4'd1, `s2, `s1 }; // (s1<s2) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_ilu, 4'd1, `s2, `s2 }; // (s2<s2) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// inlu |
i=i+1; ram[i] = { `jmp_inlu, 4'd1, `s0, `s0 }; // (s0>=s0) ? jump (YYY) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inlu, 4'd1, `s0, `s1 }; // (s1>=s0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inlu, 4'd1, `s0, `s2 }; // (s2>=s0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `jmp_inlu, 4'd1, `s1, `s0 }; // (s0>=s1) ? jump (NYY) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_inlu, 4'd1, `s1, `s1 }; // (s1>=s1) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inlu, 4'd1, `s1, `s2 }; // (s2>=s1) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `jmp_inlu, 4'd1, `s2, `s0 }; // (s0>=s2) ? jump (NNY) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_inlu, 4'd1, `s2, `s1 }; // (s1>=s2) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_inlu, 4'd1, `s2, `s2 }; // (s2>=s2) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// ils |
i=i+1; ram[i] = { `jmp_ils, 4'd1, `s0, `s0 }; // (s0<s0) ? jump (NNY) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ils, 4'd1, `s0, `s1 }; // (s1<s0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ils, 4'd1, `s0, `s2 }; // (s2<s0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `jmp_ils, 4'd1, `s1, `s0 }; // (s0<s1) ? jump (YNY) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_ils, 4'd1, `s1, `s1 }; // (s1<s1) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ils, 4'd1, `s1, `s2 }; // (s2<s1) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `jmp_ils, 4'd1, `s2, `s0 }; // (s0<s2) ? jump (NNN) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ils, 4'd1, `s2, `s1 }; // (s1<s2) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ils, 4'd1, `s2, `s2 }; // (s2<s2) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// inls |
i=i+1; ram[i] = { `jmp_inls, 4'd1, `s0, `s0 }; // (s0>=s0) ? jump (YYN) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inls, 4'd1, `s0, `s1 }; // (s1>=s0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inls, 4'd1, `s0, `s2 }; // (s2>=s0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// |
i=i+1; ram[i] = { `jmp_inls, 4'd1, `s1, `s0 }; // (s0>=s1) ? jump (NYN) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_inls, 4'd1, `s1, `s1 }; // (s1>=s1) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inls, 4'd1, `s1, `s2 }; // (s2>=s1) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// |
i=i+1; ram[i] = { `jmp_inls, 4'd1, `s2, `s0 }; // (s0>=s2) ? jump (YYY) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inls, 4'd1, `s2, `s1 }; // (s1>=s2) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inls, 4'd1, `s2, `s2 }; // (s2>=s2) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// cleanup |
i=i+1; ram[i] = { `pop, 8'b00000111 }; // pop s0, s1, s2 |
// check for no opcode errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0900 |
i=i+1; ram[i] = 16'h0900 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0910 |
i=i+1; ram[i] = 16'h0910 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// copy result to s0 |
i=i+1; ram[i] = { `cpy, `P3, `s0 }; // s0=s3, pop s3 |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
|
// test all jmp_i (A?0) instructions, result in s0. |
// Correct functioning is s0 = 'd16 ('h10). |
// |
// s0 : 0 & final test result |
// s1 : +1 |
// s2 : -2 |
// s3 : running test result |
// |
// setup test values and running test result: |
i='h400; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `dat_is, 6'd1, `s1 }; // s1=1 |
i=i+1; ram[i] = { `dat_is, -6'd2, `s2 }; // s2=-2 |
i=i+1; ram[i] = { `dat_is, 6'd0, `s3 }; // s3=0 |
// |
// distance testing |
// |
i=i+1; ram[i] = { `jmp_iz, 6'd31, `s0 }; // jump forward |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // (+0,-33) s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // (+1,-32) s3++ (backward jump lands here) |
i=i+1; ram[i] = { `jmp_iz, 6'd30, `s0 }; // (+2,-31) jump forward (and out) |
// 27 don't cares here |
i=i+28; ram[i] = { `add_is, -6'd1, `P3 }; // (+30,-3) s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // (+31,-2) s3++ (forward jump lands here) |
i=i+1; ram[i] = { `jmp_iz, -6'd32, `s0 }; // jump back |
// |
// (A?0) testing |
// |
// z |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `s0 }; // (s0==0) ? jump (YNN) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `s1 }; // (s1==0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `s2 }; // (s2==0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// nz |
i=i+1; ram[i] = { `jmp_inz, 6'd1, `s0 }; // (s0!=0) ? jump (NYY) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_inz, 6'd1, `s1 }; // (s1!=0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inz, 6'd1, `s2 }; // (s2!=0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// lz |
i=i+1; ram[i] = { `jmp_ilz, 6'd1, `s0 }; // (s0<0) ? jump (NNY) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ilz, 6'd1, `s1 }; // (s1<0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_ilz, 6'd1, `s2 }; // (s2<0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// nlz |
i=i+1; ram[i] = { `jmp_inlz, 6'd1, `s0 }; // (s0>=0) ? jump (YYN) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inlz, 6'd1, `s1 }; // (s1>=0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_inlz, 6'd1, `s2 }; // (s2>=0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// cleanup |
i=i+1; ram[i] = { `pop, 8'b00000111 }; // pop s0, s1, s2 |
// check for no opcode errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0900 |
i=i+1; ram[i] = 16'h0900 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0910 |
i=i+1; ram[i] = 16'h0910 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// copy result to s0 |
i=i+1; ram[i] = { `cpy, `P3, `s0 }; // s0=s3, pop s3 |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
// test all jmp instructions, result in s0. |
// Correct functioning is s0 = 'd19 ('h13). |
// |
// s0 : 0 & final test result |
// s1 : +1 |
// s2 : -2 |
// s3 : running test result |
// |
// setup test values and running test result: |
i='h500; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `dat_is, 6'd1, `s1 }; // s1=1 |
i=i+1; ram[i] = { `dat_is, -6'd2, `s2 }; // s2=-2 |
i=i+1; ram[i] = { `dat_is, 6'd0, `s3 }; // s3=0 |
// |
// distance testing |
// |
i=i+1; ram[i] = { `dat_is, 6'd30, `s0 }; // s0=30 |
i=i+1; ram[i] = { `dat_is, -6'd32, `s0 }; // s0=-32 |
i=i+1; ram[i] = { `dat_is, 6'd31, `s0 }; // s0=31 |
i=i+1; ram[i] = { `jmp, `P0, `__ }; // jump forward 31, pop s0 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // (+0,-33) s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // (+1,-32) s3++ (backward jump lands here) |
i=i+1; ram[i] = { `jmp, `P0, `s0 }; // (+2,-31) jump forward 30 (and out) |
// 27 don't cares here |
i=i+28; ram[i] = { `add_is, -6'd1, `P3 }; // (+30,-3) s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // (+31,-2) s3++ (forward jump lands here) |
i=i+1; ram[i] = { `jmp, `P0, `__ }; // jump back -32, pop s1 |
// |
// unconditional testing |
// |
i=i+1; ram[i] = { `jmp, `s1, `s0 }; // jump (s0?0) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp, `s1, `s1 }; // jump (s1?0) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp, `s1, `s2 }; // jump (s2?0) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
// (A?0) testing |
// z |
i=i+1; ram[i] = { `jmp_z, `s1, `s0 }; // (s0==0) ? jump (YNN) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_z, `s1, `s1 }; // (s1==0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_z, `s1, `s2 }; // (s2==0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// nz |
i=i+1; ram[i] = { `jmp_nz, `s1, `s0 }; // (s0!=0) ? jump (NYY) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_nz, `s1, `s1 }; // (s1!=0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_nz, `s1, `s2 }; // (s2!=0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// lz |
i=i+1; ram[i] = { `jmp_lz, `s1, `s0 }; // (s0<0) ? jump (NNY) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_lz, `s1, `s1 }; // (s1<0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
i=i+1; ram[i] = { `jmp_lz, `s1, `s2 }; // (s2<0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// nlz |
i=i+1; ram[i] = { `jmp_nlz, `s1, `s0 }; // (s0>=0) ? jump (YYN) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_nlz, `s1, `s1 }; // (s1>=0) ? jump |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `jmp_nlz, `s1, `s2 }; // (s2>=0) ? jump |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ (N) |
// cleanup |
i=i+1; ram[i] = { `pop, 8'b00000111 }; // pop s0, s1, s2 |
// check for no opcode errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0900 |
i=i+1; ram[i] = 16'h0900 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0910 |
i=i+1; ram[i] = 16'h0910 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// copy result to s0 |
i=i+1; ram[i] = { `cpy, `P3, `s0 }; // s0=s3, pop s3 |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
// test all gto instructions, result in s0. |
// Correct functioning is s0 = 'd7 ('h7). |
// |
// s0 : 0 & final test result |
// s1 : PC |
// s2 : -2 |
// s3 : running test result |
// |
// setup test values and running test result: |
i='h600; ram[i] = { `dat_is, 6'd0, `s0 }; // s0=0 |
i=i+1; ram[i] = { `dat_is, -6'd2, `s2 }; // s2=-2 |
i=i+1; ram[i] = { `dat_is, 6'd0, `s3 }; // s3=0 |
// |
// distance testing |
// |
i=i+1; ram[i] = { `pgc, `__, `s1 }; // s1=pc |
i=i+1; ram[i] = { `add_is, 6'd6, `P1 }; // s1+=6 |
i=i+1; ram[i] = { `gto, `P1, `__ }; // go forward, pop s1 |
// |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `pgc, `__, `s1 }; // s1=pc |
i=i+1; ram[i] = { `add_is, 6'd6, `P1 }; // s1+=6 |
i=i+1; ram[i] = { `gto, `P1, `__ }; // go forward, pop s1 |
// |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
i=i+1; ram[i] = { `pgc, `__, `s1 }; // pc => s1 |
i=i+1; ram[i] = { `add_is, -6'd6, `P1 }; // s1-=6 |
i=i+1; ram[i] = { `gto, `P1, `__ }; // go back, pop s1 |
// |
// unconditional testing |
// |
i=i+1; ram[i] = { `pgc, `__, `s1 }; // s1=pc |
i=i+1; ram[i] = { `add_is, 6'd3, `P1 }; // s1+=3 |
i=i+1; ram[i] = { `gto, `P1, `s0 }; // go, pop s1 (YYY) |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `pgc, `__, `s1 }; // s1=pc |
i=i+1; ram[i] = { `add_is, 6'd3, `P1 }; // s1+=3 |
i=i+1; ram[i] = { `gto, `P1, `s1 }; // go, pop s1 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// |
i=i+1; ram[i] = { `pgc, `__, `s1 }; // s1=pc |
i=i+1; ram[i] = { `add_is, 6'd3, `P1 }; // s1+=3 |
i=i+1; ram[i] = { `gto, `P1, `s2 }; // go, pop s1 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- (Y) |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// cleanup |
i=i+1; ram[i] = { `pop, 8'b00000101 }; // pop s0, s2 |
// check for no opcode errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0900 |
i=i+1; ram[i] = 16'h0900 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// check for no stack errors |
i=i+1; ram[i] = { `lit_u, `__, `s7 }; // s7='h0910 |
i=i+1; ram[i] = 16'h0910 ; // |
i=i+1; ram[i] = { `gsb, `P7, `s7 }; // gsb, pop s7 (addr) |
i=i+1; ram[i] = { `jmp_iz, 6'd1, `P4 }; // (s4==0) ? skip, pop s4 |
i=i+1; ram[i] = { `add_is, -6'd1, `P3 }; // s3-- |
i=i+1; ram[i] = { `add_is, 6'd1, `P3 }; // s3++ |
// copy result to s0 |
i=i+1; ram[i] = { `cpy, `P3, `s0 }; // s0=s3, pop s3 |
// loop forever |
i=i+1; ram[i] = { `jmp_ie, -4'd1, `s0, `s0 }; // loop forever |
|
|
|
// sub : read & clear opcode errors for this thread => s4, return to (s7) |
// avoid the use of s1! |
i='h900; ram[i] = { `dat_is, `THRD_ID, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `P6, `s5 }; // s5=(s6), pop s6 |
i=i+1; ram[i] = { `pow, `P5, `s4 }; // s4=1<<s5, pop s5 |
i=i+1; ram[i] = { `dat_is, `OP_ER, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `s6, `s5 }; // s5=(s6) |
i=i+1; ram[i] = { `and, `P5, `P4 }; // s4&=s5, pop s5 |
i=i+1; ram[i] = { `reg_w, `P6, `s4 }; // (s6)=s4, pop s6 |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return to (s7), pop s7 |
|
|
// sub : read & clear stack errors for this thread => s4, return to (s7) |
// avoid the use of s1! |
i='h910; ram[i] = { `dat_is, `THRD_ID, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `P6, `s5 }; // s5=(s6), pop s6 |
i=i+1; ram[i] = { `pow, `P5, `s4 }; // s4=1<<s5, pop s5 |
i=i+1; ram[i] = { `cpy, `s4, `s5 }; // s5=s4 |
i=i+1; ram[i] = { `shl_is, 6'd8, `P5 }; // s5<<=8 |
i=i+1; ram[i] = { `orr, `P5, `P4 }; // s4|=s5, pop s5 |
i=i+1; ram[i] = { `dat_is, `STK_ER, `s6 }; // s6=reg addr |
i=i+1; ram[i] = { `reg_rs, `s6, `s5 }; // s5=(s6) |
i=i+1; ram[i] = { `and, `P5, `P4 }; // s4&=s5, pop s5 |
i=i+1; ram[i] = { `reg_w, `P6, `s4 }; // (s6)=s4, pop s6 |
i=i+1; ram[i] = { `gto, `P7, `__ }; // return to (s7), pop s7 |
|
|
end |
/trunk/v04.05/reg_mem_shim.v
0,0 → 1,174
/* |
-------------------------------------------------------------------------------- |
|
Module: reg_mem_shim.v |
|
Function: |
- Shim for internal register set and main memory r/w accesses. |
|
Instantiates: |
- (6x) pipe.v |
|
Notes: |
- I/O registered. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module reg_mem_shim |
#( |
parameter integer DATA_W = 32, // data width (bits) |
parameter integer ADDR_W = 16, // address width (bits) |
parameter integer IM_W = 8 // immediate width |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire hgh_i, // 1=high |
input wire lit_i, // 1=literal data |
// |
input wire dm_wr_i, // 1=write |
input wire rg_rd_i, // 1=read |
input wire rg_wr_i, // 1=write |
// |
output wire dm_wr_o, // 1=write |
output wire rg_rd_o, // 1=read |
output wire rg_wr_o, // 1=write |
// data I/O |
input wire [DATA_W-1:0] a_data_i, // operand |
output wire [DATA_W/2-1:0] wr_data_o, // write data |
// address I/O |
input wire [ADDR_W-1:0] b_addr_i, // b |
input wire [IM_W-1:0] im_i, // immediate |
input wire [ADDR_W-1:0] pc_1_i, // program counter |
output wire [ADDR_W-1:0] rg_addr_o, // address |
output wire [ADDR_W-1:0] dm_addr_o // address |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
wire hgh, lit, dm_wr, rg_rd, rg_wr; |
wire [ADDR_W-1:0] b_addr, rg_addr, dm_addr; |
wire [IM_W-1:0] im; |
wire [DATA_W-1:0] a_data, wr_data; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// input ctrl regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( 5 ), |
.RESET_VAL ( 0 ) |
) |
in_regs_ctrl |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { hgh_i, lit_i, dm_wr_i, rg_rd_i, rg_wr_i } ), |
.data_o ( { hgh, lit, dm_wr, rg_rd, rg_wr } ) |
); |
|
|
// input addr regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( IM_W+ADDR_W ), |
.RESET_VAL ( 0 ) |
) |
in_regs_addr |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { im_i, b_addr_i } ), |
.data_o ( { im, b_addr } ) |
); |
|
|
// input data regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( DATA_W ), |
.RESET_VAL ( 0 ) |
) |
in_regs_data |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( a_data_i ), |
.data_o ( a_data ) |
); |
|
|
// decode write data |
assign wr_data = ( hgh ) ? a_data[DATA_W-1:DATA_W/2] : a_data[DATA_W/2-1:0]; |
|
// decode address |
assign rg_addr = b_addr; |
assign dm_addr = ( lit ) ? pc_1_i : b_addr + im; |
|
|
// output ctrl regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( 3 ), |
.RESET_VAL ( 0 ) |
) |
out_regs_ctrl |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { dm_wr, rg_rd, rg_wr } ), |
.data_o ( { dm_wr_o, rg_rd_o, rg_wr_o } ) |
); |
|
|
// output addr regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( ADDR_W+ADDR_W ), |
.RESET_VAL ( 0 ) |
) |
out_regs_addr |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { rg_addr, dm_addr } ), |
.data_o ( { rg_addr_o, dm_addr_o } ) |
); |
|
|
// output data regs |
pipe |
#( |
.DEPTH ( 1 ), |
.WIDTH ( DATA_W/2 ), |
.RESET_VAL ( 0 ) |
) |
out_regs_data |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( wr_data ), |
.data_o ( wr_data_o ) |
); |
|
|
endmodule |
/trunk/v04.05/ep4ce6e22c8_demo_board.cdf
0,0 → 1,13
/* Quartus II Version 10.1 Build 197 01/19/2011 Service Pack 1 SJ Web Edition */ |
JedecChain; |
FileRevision(JESD32A); |
DefaultMfr(6E); |
|
P ActionCode(Cfg) |
Device PartName(EP4CE6) Path("F:/Docs/Eric/VERILOG/THRASH/HIVE88/") File("output_file.jic") MfrSpec(OpMask(1) SEC_Device(EPCS16) Child_OpMask(1 3)); |
|
ChainEnd; |
|
AlteraBegin; |
ChainType(JTAG); |
AlteraEnd; |
/trunk/v04.05/hive_core.vwf
0,0 → 1,2807
/* |
WARNING: Do NOT edit the input and output ports in this file in a text |
editor if you plan to continue editing the block that represents it in |
the Block Editor! File corruption is VERY likely to occur. |
*/ |
|
/* |
Copyright (C) 1991-2010 Altera Corporation |
Your use of Altera Corporation's design tools, logic functions |
and other software and tools, and its AMPP partner logic |
functions, and any output files from any of the foregoing |
(including device programming or simulation files), and any |
associated documentation or information are expressly subject |
to the terms and conditions of the Altera Program License |
Subscription Agreement, Altera MegaCore Function License |
Agreement, or other applicable license agreement, including, |
without limitation, that your use is for the sole purpose of |
programming logic devices manufactured by Altera and sold by |
Altera or its authorized distributors. Please refer to the |
applicable agreement for further details. |
*/ |
|
HEADER |
{ |
VERSION = 1; |
TIME_UNIT = ns; |
DATA_OFFSET = 0.0; |
DATA_DURATION = 150000.0; |
SIMULATION_TIME = 0.0; |
GRID_PHASE = 0.0; |
GRID_PERIOD = 50.0; |
GRID_DUTY_CYCLE = 50; |
} |
|
SIGNAL("clk_i") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = ""; |
} |
|
SIGNAL("intr_req_i") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = BUS; |
WIDTH = 8; |
LSB_INDEX = 0; |
DIRECTION = INPUT; |
PARENT = ""; |
} |
|
SIGNAL("intr_req_i[7]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "intr_req_i"; |
} |
|
SIGNAL("intr_req_i[6]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "intr_req_i"; |
} |
|
SIGNAL("intr_req_i[5]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "intr_req_i"; |
} |
|
SIGNAL("intr_req_i[4]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "intr_req_i"; |
} |
|
SIGNAL("intr_req_i[3]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "intr_req_i"; |
} |
|
SIGNAL("intr_req_i[2]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "intr_req_i"; |
} |
|
SIGNAL("intr_req_i[1]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "intr_req_i"; |
} |
|
SIGNAL("intr_req_i[0]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "intr_req_i"; |
} |
|
SIGNAL("io_i") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = BUS; |
WIDTH = 32; |
LSB_INDEX = 0; |
DIRECTION = INPUT; |
PARENT = ""; |
} |
|
SIGNAL("io_i[31]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[30]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[29]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[28]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[27]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[26]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[25]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[24]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[23]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[22]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[21]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[20]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[19]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[18]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[17]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[16]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[15]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[14]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[13]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[12]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[11]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[10]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[9]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[8]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[7]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[6]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[5]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[4]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[3]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[2]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[1]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_i[0]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = "io_i"; |
} |
|
SIGNAL("io_o") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = BUS; |
WIDTH = 32; |
LSB_INDEX = 0; |
DIRECTION = OUTPUT; |
PARENT = ""; |
} |
|
SIGNAL("io_o[31]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[30]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[29]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[28]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[27]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[26]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[25]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[24]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[23]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[22]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[21]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[20]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[19]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[18]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[17]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[16]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[15]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[14]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[13]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[12]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[11]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[10]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[9]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[8]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[7]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[6]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[5]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[4]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[3]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[2]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[1]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("io_o[0]") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = "io_o"; |
} |
|
SIGNAL("rst_i") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = ""; |
} |
|
SIGNAL("divider 681") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = ""; |
} |
|
SIGNAL("divider 477") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = ""; |
} |
|
SIGNAL("divider 1788") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = ""; |
} |
|
SIGNAL("divider 2870") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = ""; |
} |
|
GROUP("io_o_char") |
{ |
MEMBERS = "io_o[31]", "io_o[30]", "io_o[29]", "io_o[28]", "io_o[27]"; |
} |
|
GROUP("io_o_mant") |
{ |
MEMBERS = "io_o[26]", "io_o[25]", "io_o[24]", "io_o[23]", "io_o[22]", "io_o[21]", "io_o[20]", "io_o[19]", "io_o[18]", "io_o[17]", "io_o[16]", "io_o[15]", "io_o[14]", "io_o[13]", "io_o[12]", "io_o[11]", "io_o[10]", "io_o[9]", "io_o[8]", "io_o[7]", "io_o[6]", "io_o[5]", "io_o[4]", "io_o[3]", "io_o[2]", "io_o[1]", "io_o[0]"; |
} |
|
SIGNAL("uart_rx_i") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = ""; |
} |
|
SIGNAL("uart_tx_o") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = OUTPUT; |
PARENT = ""; |
} |
|
SIGNAL("divider 2733") |
{ |
VALUE_TYPE = NINE_LEVEL_BIT; |
SIGNAL_TYPE = SINGLE_BIT; |
WIDTH = 1; |
LSB_INDEX = -1; |
DIRECTION = INPUT; |
PARENT = ""; |
} |
|
TRANSITION_LIST("clk_i") |
{ |
NODE |
{ |
REPEAT = 1; |
NODE |
{ |
REPEAT = 3000; |
LEVEL 0 FOR 25.0; |
LEVEL 1 FOR 25.0; |
} |
} |
} |
|
TRANSITION_LIST("intr_req_i[7]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 12800.0; |
LEVEL 1 FOR 49600.0; |
LEVEL 0 FOR 25600.0; |
LEVEL 1 FOR 1600.0; |
LEVEL 0 FOR 60400.0; |
} |
} |
|
TRANSITION_LIST("intr_req_i[6]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 38400.0; |
LEVEL 1 FOR 24000.0; |
LEVEL 0 FOR 22400.0; |
LEVEL 1 FOR 1600.0; |
LEVEL 0 FOR 63600.0; |
} |
} |
|
TRANSITION_LIST("intr_req_i[5]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 57600.0; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 19200.0; |
LEVEL 1 FOR 1600.0; |
LEVEL 0 FOR 66800.0; |
} |
} |
|
TRANSITION_LIST("intr_req_i[4]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 51200.0; |
LEVEL 1 FOR 11200.0; |
LEVEL 0 FOR 16000.0; |
LEVEL 1 FOR 1600.0; |
LEVEL 0 FOR 70000.0; |
} |
} |
|
TRANSITION_LIST("intr_req_i[3]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 25600.0; |
LEVEL 1 FOR 36800.0; |
LEVEL 0 FOR 12800.0; |
LEVEL 1 FOR 1600.0; |
LEVEL 0 FOR 73200.0; |
} |
} |
|
TRANSITION_LIST("intr_req_i[2]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 32000.0; |
LEVEL 1 FOR 30400.0; |
LEVEL 0 FOR 9600.0; |
LEVEL 1 FOR 1600.0; |
LEVEL 0 FOR 76400.0; |
} |
} |
|
TRANSITION_LIST("intr_req_i[1]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 44800.0; |
LEVEL 1 FOR 17600.0; |
LEVEL 0 FOR 6400.0; |
LEVEL 1 FOR 1600.0; |
LEVEL 0 FOR 79600.0; |
} |
} |
|
TRANSITION_LIST("intr_req_i[0]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 19200.0; |
LEVEL 1 FOR 43200.0; |
LEVEL 0 FOR 3200.0; |
LEVEL 1 FOR 1600.0; |
LEVEL 0 FOR 82800.0; |
} |
} |
|
TRANSITION_LIST("io_i[31]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[30]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[29]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[28]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[27]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[26]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[25]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[24]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[23]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[22]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[21]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[20]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[19]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[18]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[17]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[16]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[15]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[14]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[13]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[12]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[11]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[10]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 5000.0; |
LEVEL 1 FOR 140200.0; |
} |
} |
|
TRANSITION_LIST("io_i[9]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[8]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[7]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[6]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[5]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[4]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 9800.0; |
LEVEL 1 FOR 140200.0; |
} |
} |
|
TRANSITION_LIST("io_i[3]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_i[2]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 4800.0; |
LEVEL 0 FOR 5000.0; |
LEVEL 1 FOR 140200.0; |
} |
} |
|
TRANSITION_LIST("io_i[1]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 4800.0; |
LEVEL 1 FOR 145200.0; |
} |
} |
|
TRANSITION_LIST("io_i[0]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 9800.0; |
LEVEL 1 FOR 140200.0; |
} |
} |
|
TRANSITION_LIST("io_o[31]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[30]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[29]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[28]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[27]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[26]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[25]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[24]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[23]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[22]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[21]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[20]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[19]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[18]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[17]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[16]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[15]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[14]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[13]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[12]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[11]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[10]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[9]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[8]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[7]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[6]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[5]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[4]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[3]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[2]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[1]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("io_o[0]") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("rst_i") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 1 FOR 50.0; |
LEVEL 0 FOR 149950.0; |
} |
} |
|
TRANSITION_LIST("uart_rx_i") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL 0 FOR 150000.0; |
} |
} |
|
TRANSITION_LIST("uart_tx_o") |
{ |
NODE |
{ |
REPEAT = 1; |
LEVEL X FOR 150000.0; |
} |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "rst_i"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 0; |
TREE_LEVEL = 0; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "clk_i"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 1; |
TREE_LEVEL = 0; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "divider 681"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Binary; |
TREE_INDEX = 2; |
TREE_LEVEL = 0; |
IS_DIVIDER = ON; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "intr_req_i"; |
EXPAND_STATUS = EXPANDED; |
RADIX = Unsigned; |
TREE_INDEX = 3; |
TREE_LEVEL = 0; |
CHILDREN = 4, 5, 6, 7, 8, 9, 10, 11; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "intr_req_i[7]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 4; |
TREE_LEVEL = 1; |
PARENT = 3; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "intr_req_i[6]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 5; |
TREE_LEVEL = 1; |
PARENT = 3; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "intr_req_i[5]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 6; |
TREE_LEVEL = 1; |
PARENT = 3; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "intr_req_i[4]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 7; |
TREE_LEVEL = 1; |
PARENT = 3; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "intr_req_i[3]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 8; |
TREE_LEVEL = 1; |
PARENT = 3; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "intr_req_i[2]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 9; |
TREE_LEVEL = 1; |
PARENT = 3; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "intr_req_i[1]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 10; |
TREE_LEVEL = 1; |
PARENT = 3; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "intr_req_i[0]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 11; |
TREE_LEVEL = 1; |
PARENT = 3; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "divider 477"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Binary; |
TREE_INDEX = 12; |
TREE_LEVEL = 0; |
IS_DIVIDER = ON; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 13; |
TREE_LEVEL = 0; |
CHILDREN = 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[31]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 14; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[30]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 15; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[29]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 16; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[28]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 17; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[27]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 18; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[26]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 19; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[25]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 20; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[24]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 21; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[23]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 22; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[22]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 23; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[21]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 24; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[20]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 25; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[19]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 26; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[18]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 27; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[17]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 28; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[16]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 29; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[15]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 30; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[14]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 31; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[13]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 32; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[12]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 33; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[11]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 34; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[10]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 35; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[9]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 36; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[8]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 37; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[7]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 38; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[6]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 39; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[5]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 40; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[4]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 41; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[3]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 42; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[2]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 43; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[1]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 44; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_i[0]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 45; |
TREE_LEVEL = 1; |
PARENT = 13; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "divider 1788"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Binary; |
TREE_INDEX = 46; |
TREE_LEVEL = 0; |
IS_DIVIDER = ON; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 47; |
TREE_LEVEL = 0; |
CHILDREN = 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[31]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 48; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[30]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 49; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[29]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 50; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[28]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 51; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[27]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 52; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[26]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 53; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[25]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 54; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[24]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 55; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[23]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 56; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[22]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 57; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[21]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 58; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[20]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 59; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[19]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 60; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[18]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 61; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[17]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 62; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[16]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 63; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[15]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 64; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[14]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 65; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[13]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 66; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[12]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 67; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[11]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 68; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[10]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 69; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[9]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 70; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[8]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 71; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[7]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 72; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[6]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 73; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[5]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 74; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[4]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 75; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[3]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 76; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[2]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 77; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[1]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 78; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[0]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 79; |
TREE_LEVEL = 1; |
PARENT = 47; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "divider 2870"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Binary; |
TREE_INDEX = 80; |
TREE_LEVEL = 0; |
IS_DIVIDER = ON; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o_char"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 81; |
TREE_LEVEL = 0; |
CHILDREN = 82, 83, 84, 85, 86; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[31]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 82; |
TREE_LEVEL = 1; |
PARENT = 81; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[30]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 83; |
TREE_LEVEL = 1; |
PARENT = 81; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[29]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 84; |
TREE_LEVEL = 1; |
PARENT = 81; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[28]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 85; |
TREE_LEVEL = 1; |
PARENT = 81; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[27]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 86; |
TREE_LEVEL = 1; |
PARENT = 81; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o_mant"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 87; |
TREE_LEVEL = 0; |
CHILDREN = 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[26]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 88; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[25]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 89; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[24]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 90; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[23]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 91; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[22]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 92; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[21]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 93; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[20]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 94; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[19]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 95; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[18]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 96; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[17]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 97; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[16]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 98; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[15]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 99; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[14]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 100; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[13]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 101; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[12]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 102; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[11]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 103; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[10]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 104; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[9]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 105; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[8]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 106; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[7]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 107; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[6]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 108; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[5]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 109; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[4]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 110; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[3]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 111; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[2]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 112; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[1]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 113; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "io_o[0]"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Unsigned; |
TREE_INDEX = 114; |
TREE_LEVEL = 1; |
PARENT = 87; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "divider 2733"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Binary; |
TREE_INDEX = 115; |
TREE_LEVEL = 0; |
IS_DIVIDER = ON; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "uart_rx_i"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Binary; |
TREE_INDEX = 116; |
TREE_LEVEL = 0; |
} |
|
DISPLAY_LINE |
{ |
CHANNEL = "uart_tx_o"; |
EXPAND_STATUS = COLLAPSED; |
RADIX = Binary; |
TREE_INDEX = 117; |
TREE_LEVEL = 0; |
} |
|
TIME_BAR |
{ |
TIME = 16850; |
MASTER = TRUE; |
} |
; |
/trunk/v04.05/alu_add_sub.v
0,0 → 1,165
/* |
-------------------------------------------------------------------------------- |
|
Module : alu_add_sub.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Add & subtract unit for a processor ALU. |
|
Instantiates: |
- (4x) pipe.v |
|
Notes: |
- IN/MID/OUT/FLG optionally registered. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module alu_add_sub |
#( |
parameter integer REGS_IN = 1, // in register option |
parameter integer REGS_MID = 1, // mid register option |
parameter integer REGS_OUT = 1, // out register option |
parameter integer REGS_FLG = 1, // flag register option |
parameter integer DATA_W = 3 // data width |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// control I/O |
input wire sgn_i, // 1=signed |
input wire ext_i, // 1=extended result |
input wire sub_i, // 1=subtract; 0=add |
// data I/O |
input wire [DATA_W-1:0] a_i, // operand |
input wire [DATA_W-1:0] b_i, // operand |
output wire [DATA_W-1:0] result_o, // = ( a +/- b ) |
// flags |
output wire flg_ne_o, // a != b |
output wire flg_lt_o // a < b |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
localparam integer ZSX_W = DATA_W+1; // +1 extra bit |
localparam integer ADD_SUB_W = DATA_W+2; // +2 extra bits |
localparam integer DBL_W = DATA_W*2; // double width |
// |
wire sgn, sub, ext, sub_m, ext_m; |
wire signed [DATA_W-1:0] a, b; |
wire signed [ZSX_W-1:0] a_zsx, b_zsx; |
wire signed [ADD_SUB_W-1:0] ab_add, ab_sub, ab_add_m, ab_sub_m; |
reg signed [DBL_W-1:0] res_dbl; |
reg signed [DATA_W-1:0] result; |
wire flg_ne, flg_lt; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// optional input regs |
pipe |
#( |
.DEPTH ( REGS_IN ), |
.WIDTH ( 3+DATA_W+DATA_W ), |
.RESET_VAL ( 0 ) |
) |
in_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { sub_i, ext_i, sgn_i, b_i, a_i } ), |
.data_o ( { sub, ext, sgn, b, a } ) |
); |
|
|
// zero|sign extend results |
assign a_zsx = { ( sgn & a[DATA_W-1] ), a }; |
assign b_zsx = { ( sgn & b[DATA_W-1] ), b }; |
|
// arithmetic results (signed) |
assign ab_add = a_zsx + b_zsx; |
assign ab_sub = a_zsx - b_zsx; |
|
// flags |
assign flg_ne = ( a != b ); |
assign flg_lt = ab_sub[ZSX_W-1]; |
|
|
// optional flag regs |
pipe |
#( |
.DEPTH ( REGS_FLG ), |
.WIDTH ( 2 ), |
.RESET_VAL ( 0 ) |
) |
regs_flags |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { flg_ne, flg_lt } ), |
.data_o ( { flg_ne_o, flg_lt_o } ) |
); |
|
|
// optional mid regs |
pipe |
#( |
.DEPTH ( REGS_MID ), |
.WIDTH ( 2+ADD_SUB_W+ADD_SUB_W ), |
.RESET_VAL ( 0 ) |
) |
mid_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( { sub, ext, ab_sub, ab_add } ), |
.data_o ( { sub_m, ext_m, ab_sub_m, ab_add_m } ) |
); |
|
|
// multiplex |
always @ ( * ) begin |
case ( sub_m ) |
'b1 : res_dbl <= ab_sub_m; |
default : res_dbl <= ab_add_m; |
endcase |
end |
|
// multiplex & extend |
always @ ( * ) begin |
case ( ext_m ) |
'b1 : result <= res_dbl[DBL_W-1:DATA_W]; |
default : result <= res_dbl[DATA_W-1:0]; |
endcase |
end |
|
|
// optional output regs |
pipe |
#( |
.DEPTH ( REGS_OUT ), |
.WIDTH ( DATA_W ), |
.RESET_VAL ( 0 ) |
) |
out_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( result ), |
.data_o ( result_o ) |
); |
|
|
endmodule |
/trunk/v04.05/hive_core.v
0,0 → 1,397
/* |
-------------------------------------------------------------------------------- |
|
Module : hive_core.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- General purpose barrel processor FPGA core with: |
- 8 threads & 8 stage pipeline |
- 8 simple stacks per thread |
- 32 bit data |
- 16 bit opcode |
- 16 bit address |
|
Instantiates (at this level): |
- control_ring.v |
- data_ring.v |
- reg_set.v |
- reg_mem_shim.v |
- dp_ram_infer.v |
|
-------------------- |
- Revision History - |
-------------------- |
|
v04.05 - 2014-01-02 |
- Note main version jump. |
- Branched design back into main line. |
- OP_CODE_W is now MEM_DATA_W. |
|
v01.04 - 2014-01-01 |
- Moved register set and main memory data port one pipeline stage later. |
- op_pow is back and is now sign neutral. |
- Op renaming: psh_iu => psu_i. |
- `_0, `_1, etc. is now `s* in all boot code. |
- Added header blocking statements to some *.h files (didn't work for all). |
- Use of real rather than integer types in UART calculations for clarity. |
- EP3C5E144C: 2662 LEs, 198MHz (w/o DSE, synthesis optimized for speed). |
- Passes all boot code verification & functional tests. |
|
v01.03 - 2013-12-23 |
- Short 4 bit (+7/-8) immediate (A?B) jumps have replaced all following jumps. |
- Removed unconditional immediate jump (use op_jmp_ie). |
- Immediate (A?0) jumps, data, and add IM value reduced to 6 bits. |
- Removed op_pow_i, op_shl_iu is op_psh_iu: combo pow2 and right shift, |
op_shl_u is strictly unsigned shift. |
- UART added to register set. |
- Op renaming: |
dat_f* => lit_* |
shl_iu => psh_iu |
- Small changes to register set base component parameters & I/O. |
- Opcode encode/decode now over full opcode width. |
- EP3C5E144C: 2650 LEs, 189MHz (w/o DSE). |
- Passes all boot code verification & functional tests. |
|
v01.02 - 2013-12-06 |
- Following jumps (jmp_f) have replaced all skips. |
- Added op_pow & op_pow_i opcodes. |
- A odd testing removed (lack of opcode space). |
- op_pop now covers all stacks at once via {pb, sb, pa, sa} binary field. |
- op_reg_r now signed, added read and write high register ops (_wh is ~free). |
- Added op_lit_u to accomodate 16 bit addresses & such. |
- Op renaming: |
lit => dat_f |
byt => dat_i |
*_sx => *_xs |
*_ux => *_xu |
- Moved PC interrupt & jmp_f address loads to stage 4 of PC pipe. |
- op_dat_fh now uses A as source of low data rather than B, |
which is more consistent and allows unrelated pop. |
- Register set addresses now defined as 8 bits wide. |
- EP3C5E144C: ~2500 LEs, 185MHz (w/o DSE). |
- Passes all boot code verification tests. |
- Passes boot code functional tests: divide, sqrt, log2, exp2. |
|
v01.01 - 2013-11-19 |
- Born. Based on Hive v3.10. Has 8 stacks per thread. |
- Skips are back for A odd and (A?B) testing. |
- Removed op_cls as it seems too dangerous. May put back in register set. |
- Lots of op renaming: |
dat_f => lit |
dat_i => byt |
or_br => bro, etc. |
or => orr |
pc => pgc (to make all op bases 3 letters) |
- Reg access now unsigned low with no immediate offset. |
- Added register to flag decode output, moved all PC changes to stage 3. |
- EP3C5E144C: ~2400 LEs, 178MHz (w/o DSE). |
- BROKEN: reg_mem_shim.v has bad decoding for dmem addr. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module hive_core |
#( |
parameter integer CLK_HZ = 160000000, // master clk_i rate (Hz) |
parameter integer DATA_W = 32, // data width |
parameter integer THREADS = 8, // threads (don't change!) |
parameter [DATA_W/4-1:0] VER_MAJ = 'h04, // core version |
parameter [DATA_W/4-1:0] VER_MIN = 'h05 // core version |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// |
input wire [THREADS-1:0] intr_req_i, // event request, active high |
// |
input wire [DATA_W-1:0] io_i, // gpio |
output wire [DATA_W-1:0] io_o, |
// |
input wire uart_rx_i, // serial data |
output wire uart_tx_o // serial data |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
`include "functions.h" // for clog2() |
// |
localparam integer ADDR_W = DATA_W/2; // address width |
localparam integer PNTR_W = 5; // stack pointer width |
localparam integer MEM_ADDR_W = 13; // main memory address width |
localparam integer MEM_DATA_W = DATA_W/2; // main memory data width |
localparam [ADDR_W-1:0] CLR_BASE = 'h0; // clear address base (concat) |
localparam integer CLR_SPAN = 2; // clear address span (2^n) |
localparam [ADDR_W-1:0] INTR_BASE = 'h20; // interrupt address base (concat) |
localparam integer INTR_SPAN = 2; // interrupt address span (2^n) |
localparam integer THRD_W = clog2( THREADS ); |
localparam integer STACKS = 8; // number of stacks |
localparam integer STK_W = clog2( STACKS ); |
localparam integer IM_W = 6; // immediate width |
localparam integer LG_SEL_W = 4; |
localparam integer REG_ADDR_W = 4; |
localparam integer DM_OFFS_W = 4; |
localparam integer PROT_POP = 1; // 1=error protection, 0=none |
localparam integer PROT_PUSH = 1; // 1=error protection, 0=none |
localparam integer UART_DATA_W = 8; // uart data width (bits) |
localparam integer UART_BAUD_RATE = 115200; // uart baud rate (Hz) |
// |
wire [THREADS-1:0] clr_req; |
wire [THREADS-1:0] intr_en; |
wire [MEM_DATA_W-1:0] op_code; |
wire op_code_er; |
wire [STK_W-1:0] data_sel_a, data_sel_b, addr_sel_b; |
wire imda; |
wire imad; |
wire sgn, ext, hgh; |
wire lg; |
wire [LG_SEL_W-1:0] lg_sel; |
wire add, sub, mul, shl, pow, rtn; |
wire stk_clr; |
wire [STACKS-1:0] pop, push, pop_er_2, push_er_3; |
wire [DATA_W-1:0] a_data; |
wire [ADDR_W-1:0] b_addr; |
wire [IM_W-1:0] im; |
wire flg_od_2, flg_nz_2, flg_lz_2, flg_ne_2, flg_lt_2; |
wire [THRD_W-1:0] thrd_0, thrd_2, thrd_3, thrd_6; |
wire [ADDR_W-1:0] pc_1, pc_3, pc_4; |
wire [MEM_DATA_W-1:0] dm_rd_data_4, rg_rd_data_4; |
wire [MEM_DATA_W-1:0] wr_data_2; |
wire [ADDR_W-1:0] dm_addr_2, rg_addr_2; |
wire dm_rd, dm_wr, rg_rd, rg_wr; |
wire dm_wr_2, rg_rd_2, rg_wr_2; |
wire lit; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// the control ring |
control_ring |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.THREADS ( THREADS ), |
.THRD_W ( THRD_W ), |
.STACKS ( STACKS ), |
.STK_W ( STK_W ), |
.IM_W ( IM_W ), |
.MEM_DATA_W ( MEM_DATA_W ), |
.LG_SEL_W ( LG_SEL_W ), |
.CLR_BASE ( CLR_BASE ), |
.CLR_SPAN ( CLR_SPAN ), |
.INTR_BASE ( INTR_BASE ), |
.INTR_SPAN ( INTR_SPAN ) |
) |
control_ring |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.clr_req_i ( clr_req ), |
.clr_ack_o ( ), // unused |
.intr_en_i ( intr_en ), |
.intr_req_i ( intr_req_i ), |
.intr_ack_o ( ), // unused |
.op_code_i ( op_code ), |
.op_code_er_o ( op_code_er ), |
.b_addr_i ( b_addr ), |
.im_o ( im ), |
.data_sel_a_o ( data_sel_a ), |
.data_sel_b_o ( data_sel_b ), |
.addr_sel_b_o ( addr_sel_b ), |
.imda_o ( imda ), |
.imad_o ( imad ), |
.sgn_o ( sgn ), |
.hgh_o ( hgh ), |
.ext_o ( ext ), |
.lg_sel_o ( lg_sel ), |
.add_o ( add ), |
.sub_o ( sub ), |
.mul_o ( mul ), |
.shl_o ( shl ), |
.pow_o ( pow ), |
.rtn_o ( rtn ), |
.lit_o ( lit ), |
.dm_rd_o ( dm_rd ), |
.dm_wr_o ( dm_wr ), |
.rg_rd_o ( rg_rd ), |
.rg_wr_o ( rg_wr ), |
.stk_clr_o ( stk_clr ), |
.pop_o ( pop ), |
.push_o ( push ), |
.flg_nz_2_i ( flg_nz_2 ), |
.flg_lz_2_i ( flg_lz_2 ), |
.flg_ne_2_i ( flg_ne_2 ), |
.flg_lt_2_i ( flg_lt_2 ), |
.thrd_0_o ( thrd_0 ), |
.thrd_2_o ( thrd_2 ), |
.thrd_3_o ( thrd_3 ), |
.thrd_6_o ( thrd_6 ), |
.pc_1_o ( pc_1 ), |
.pc_3_o ( pc_3 ), |
.pc_4_o ( pc_4 ) |
); |
|
|
// the data ring |
data_ring |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.THREADS ( THREADS ), |
.THRD_W ( THRD_W ), |
.STACKS ( STACKS ), |
.STK_W ( STK_W ), |
.PNTR_W ( PNTR_W ), |
.IM_W ( IM_W ), |
.LG_SEL_W ( LG_SEL_W ), |
.PROT_POP ( PROT_POP ), |
.PROT_PUSH ( PROT_PUSH ) |
) |
data_ring |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_sel_a_i ( data_sel_a ), |
.data_sel_b_i ( data_sel_b ), |
.addr_sel_b_i ( addr_sel_b ), |
.imda_i ( imda ), |
.imad_i ( imad ), |
.sgn_i ( sgn ), |
.ext_i ( ext ), |
.hgh_i ( hgh ), |
.lg_sel_i ( lg_sel ), |
.add_i ( add ), |
.sub_i ( sub ), |
.mul_i ( mul ), |
.shl_i ( shl ), |
.pow_i ( pow ), |
.rtn_i ( rtn ), |
.dm_rd_i ( dm_rd ), |
.rg_rd_i ( rg_rd ), |
.stk_clr_i ( stk_clr ), |
.pop_i ( pop ), |
.push_i ( push ), |
.thrd_6_i ( thrd_6 ), |
.im_i ( im ), |
.dm_rd_data_4_i ( dm_rd_data_4 ), |
.rg_rd_data_4_i ( rg_rd_data_4 ), |
.pc_3_i ( pc_3 ), |
.a_data_o ( a_data ), |
.b_addr_o ( b_addr ), |
.flg_nz_2_o ( flg_nz_2 ), |
.flg_lz_2_o ( flg_lz_2 ), |
.flg_ne_2_o ( flg_ne_2 ), |
.flg_lt_2_o ( flg_lt_2 ), |
.pop_er_2_o ( pop_er_2 ), |
.push_er_3_o ( push_er_3 ) |
); |
|
|
// shim for memory and register set access |
reg_mem_shim |
#( |
.DATA_W ( DATA_W ), |
.ADDR_W ( ADDR_W ), |
.IM_W ( DM_OFFS_W ) |
) |
reg_mem_shim |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.hgh_i ( hgh ), |
.lit_i ( lit ), |
.dm_wr_i ( dm_wr ), |
.rg_rd_i ( rg_rd ), |
.rg_wr_i ( rg_wr ), |
.dm_wr_o ( dm_wr_2 ), |
.rg_rd_o ( rg_rd_2 ), |
.rg_wr_o ( rg_wr_2 ), |
.a_data_i ( a_data ), |
.wr_data_o ( wr_data_2 ), |
.b_addr_i ( b_addr ), |
.im_i ( im[DM_OFFS_W-1:0] ), |
.pc_1_i ( pc_1 ), |
.rg_addr_o ( rg_addr_2 ), |
.dm_addr_o ( dm_addr_2 ) |
); |
|
|
// internal register set |
reg_set |
#( |
.REGS_IN ( 1 ), |
.REGS_OUT ( 1 ), |
.DATA_W ( DATA_W/2 ), |
.ADDR_W ( REG_ADDR_W ), |
.THREADS ( THREADS ), |
.THRD_W ( THRD_W ), |
.STACKS ( STACKS ), |
.STK_W ( STK_W ), |
.VER_MAJ ( VER_MAJ ), |
.VER_MIN ( VER_MIN ), |
.UART_DATA_W ( UART_DATA_W ), |
.CLK_HZ ( CLK_HZ ), |
.UART_BAUD_RATE ( UART_BAUD_RATE ) |
) |
reg_set |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.addr_i ( rg_addr_2[REG_ADDR_W-1:0] ), |
.wr_i ( rg_wr_2 ), |
.rd_i ( rg_rd_2 ), |
.data_i ( wr_data_2 ), |
.data_o ( rg_rd_data_4 ), |
.clr_req_o ( clr_req ), |
.intr_en_o ( intr_en ), |
.thrd_0_i ( thrd_0 ), |
.op_code_er_i ( op_code_er ), |
.thrd_2_i ( thrd_2 ), |
.pop_er_2_i ( pop_er_2 ), |
.thrd_3_i ( thrd_3 ), |
.push_er_3_i ( push_er_3 ), |
.io_lo_i ( io_i[DATA_W/2-1:0] ), |
.io_hi_i ( io_i[DATA_W-1:DATA_W/2] ), |
.io_lo_o ( io_o[DATA_W/2-1:0] ), |
.io_hi_o ( io_o[DATA_W-1:DATA_W/2] ), |
.uart_rx_i ( uart_rx_i ), |
.uart_tx_o ( uart_tx_o ) |
); |
|
|
// instruction and data memory |
dp_ram_infer |
#( |
.REG_A_OUT ( 1 ), |
.REG_B_OUT ( 1 ), |
.DATA_W ( MEM_DATA_W ), |
.ADDR_W ( MEM_ADDR_W ), |
.MODE ( "RAW" ) // functional don't care |
) |
main_mem |
( |
.a_clk_i ( clk_i ), |
.a_addr_i ( dm_addr_2 ), |
.a_wr_i ( dm_wr_2 ), |
.a_data_i ( wr_data_2 ), |
.a_data_o ( dm_rd_data_4 ), |
.b_clk_i ( clk_i ), |
.b_addr_i ( pc_4 ), |
.b_wr_i ( 1'b0 ), // unused |
.b_data_i ( ), // unused |
.b_data_o ( op_code ) |
); |
|
|
endmodule |
/trunk/v04.05/event_ctrl.v
0,0 → 1,114
/* |
-------------------------------------------------------------------------------- |
|
Module: event_ctrl.v |
|
Function: |
- Event (clear & interrupt) controller for multi-threaded processor. |
|
Instantiates: |
- (1x) pipe.v |
|
Notes: |
- Request is latched and acked until serviced. |
- Event output is valid for the stage following this one. |
- Optional req regs & resync. |
- Optional req level / edge operation. |
- For automatic clearing @ async reset, set RESET_VAL to 1. |
|
-------------------------------------------------------------------------------- |
*/ |
|
module event_ctrl |
#( |
parameter integer REGS_REQ = 2, // input registers option |
parameter integer EDGE_REQ = 0, // edge/level input option |
parameter integer RESET_VAL = 1, // async reset value option |
parameter integer THREADS = 4, // number of threads |
parameter integer THRD_W = 2 // thread width |
) |
( |
// clocks & resets |
input wire clk_i, // clock |
input wire rst_i, // async. reset, active high |
// I/O |
input wire [THRD_W-1:0] thrd_i, // thread |
input wire [THREADS-1:0] en_i, // event enable, active high |
input wire [THREADS-1:0] req_i, // event request, active high |
output reg [THREADS-1:0] ack_o, // event ack, active high until serviced |
output reg event_o // event, active high for one clock |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
wire [THREADS-1:0] req_0, req_2, thread_flag; |
|
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
// optional input req regs |
pipe |
#( |
.DEPTH ( REGS_REQ ), |
.WIDTH ( THREADS ), |
.RESET_VAL ( 0 ) |
) |
req_regs |
( |
.clk_i ( clk_i ), |
.rst_i ( rst_i ), |
.data_i ( req_i ), |
.data_o ( req_0 ) |
); |
|
|
// optional input req edge detect |
generate |
if ( EDGE_REQ ) begin |
reg [THREADS-1:0] req_1; |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
req_1 <= 'b0; |
end else begin |
req_1 <= req_0; |
end |
end |
assign req_2 = req_0 & ~req_1; |
end else begin |
assign req_2 = req_0; |
end |
endgenerate |
|
// decode thread flags (one hot) |
assign thread_flag = 1'b1 << thrd_i; |
|
// register & latch events |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
ack_o <= { THREADS{ RESET_VAL[0] } }; |
end else begin |
ack_o <= ( en_i & req_2 ) | ( ack_o & ~thread_flag ); |
end |
end |
|
// output event (use in following stage) |
always @ ( posedge clk_i or posedge rst_i ) begin |
if ( rst_i ) begin |
event_o <= 'b0; |
end else begin |
event_o <= |( ack_o & thread_flag ); |
end |
end |
|
|
endmodule |
/trunk/v04.05/ep4ce6e22c8_demo_board.v
0,0 → 1,70
/* |
-------------------------------------------------------------------------------- |
|
Module : ep4ce6e22c8_demo_board.v |
|
-------------------------------------------------------------------------------- |
|
Function: |
- Processor core with PLL & LED outputs. |
|
Instantiates: |
- hive_core.v |
- pll.v |
|
Notes: |
|
|
-------------------------------------------------------------------------------- |
*/ |
|
module ep4ce6e22c8_demo_board |
#( |
parameter integer LED_W = 4 |
) |
( |
// clocks & resets |
input wire clk_50m_i, // clock |
input wire rstn_i, // async. reset, active low |
// |
output wire [LED_W-1:0] led_o // LEDs, active low |
); |
|
|
/* |
---------------------- |
-- internal signals -- |
---------------------- |
*/ |
wire [31:0] io_o; |
wire clk_pll; |
|
|
/* |
================ |
== code start == |
================ |
*/ |
|
|
pll pll_inst ( |
.inclk0 ( clk_50m_i ), |
.c0 ( clk_pll ) |
); |
|
|
hive_core hive_core_inst |
( |
.clk_i ( clk_pll ), |
.rst_i ( ~rstn_i ), |
.intr_req_i ( ), // unused |
.io_i ( ), // unused |
.io_o ( io_o ) |
); |
|
|
// the LEDs are active low |
assign led_o = ~io_o[3:0]; |
|
|
endmodule |
/trunk/v04.05/hive_core.sdc
0,0 → 1,108
## Generated SDC file "hive_core.sdc" |
|
## Copyright (C) 1991-2010 Altera Corporation |
## Your use of Altera Corporation's design tools, logic functions |
## and other software and tools, and its AMPP partner logic |
## functions, and any output files from any of the foregoing |
## (including device programming or simulation files), and any |
## associated documentation or information are expressly subject |
## to the terms and conditions of the Altera Program License |
## Subscription Agreement, Altera MegaCore Function License |
## Agreement, or other applicable license agreement, including, |
## without limitation, that your use is for the sole purpose of |
## programming logic devices manufactured by Altera and sold by |
## Altera or its authorized distributors. Please refer to the |
## applicable agreement for further details. |
|
|
## VENDOR "Altera" |
## PROGRAM "Quartus II" |
## VERSION "Version 9.1 Build 350 03/24/2010 Service Pack 2 SJ Web Edition" |
|
## DATE "Wed May 15 09:26:03 2013" |
|
## |
## DEVICE "EP3C5E144C8" |
## |
|
|
#************************************************************** |
# Time Information |
#************************************************************** |
|
set_time_format -unit ns -decimal_places 3 |
|
|
|
#************************************************************** |
# Create Clock |
#************************************************************** |
|
create_clock -name clk_i clk_i -period "200 MHz" |
|
|
#************************************************************** |
# Create Generated Clock |
#************************************************************** |
|
|
|
#************************************************************** |
# Set Clock Latency |
#************************************************************** |
|
|
|
#************************************************************** |
# Set Clock Uncertainty |
#************************************************************** |
|
derive_clock_uncertainty |
|
|
#************************************************************** |
# Set Input Delay |
#************************************************************** |
|
|
|
#************************************************************** |
# Set Output Delay |
#************************************************************** |
|
|
|
#************************************************************** |
# Set Clock Groups |
#************************************************************** |
|
|
|
#************************************************************** |
# Set False Path |
#************************************************************** |
|
|
|
#************************************************************** |
# Set Multicycle Path |
#************************************************************** |
|
|
|
#************************************************************** |
# Set Maximum Delay |
#************************************************************** |
|
|
|
#************************************************************** |
# Set Minimum Delay |
#************************************************************** |
|
|
|
#************************************************************** |
# Set Input Transition |
#************************************************************** |
|
/trunk/v04.05/README.txt
0,0 → 1,16
* Hive soft processor core readme file * |
|
- All *.v verilog and include *.h files are in a single directory, |
where "hive_core.v" is the top level entry. |
- There are several boot code files in the "boot_code" directory, |
to use one, bring it into the main directory and rename it |
"boot_code.h". |
- There may also an "unused" directory containing files that aren't |
currently part of the project but may be of interest. |
- There is a "hive_core.qpf" project file for Altera Quartus II9.1sp2 Web Edition. |
With this tool you can compile to a target, and with the file "hive_core.vwf" you |
can simulate. I recommend functional simulation when fiddling around |
because the compile is much faster. |
- There is also a "hive_core.sdc" file which sets the target top speed to |
200 MHz in Quartus, and "hive_core.qsf" which is a project settings file. |
- Don't forget to assign pins when doing a real project! |
/trunk/v04.05/hive_core.qws
0,0 → 1,27
[ProjectWorkspace] |
ptn_Child1=Frames |
[ProjectWorkspace.Frames] |
ptn_Child1=ChildFrames |
[ProjectWorkspace.Frames.ChildFrames] |
ptn_Child1=Document-0 |
ptn_Child2=Document-1 |
[ProjectWorkspace.Frames.ChildFrames.Document-0] |
ptn_Child1=ViewFrame-0 |
[ProjectWorkspace.Frames.ChildFrames.Document-0.ViewFrame-0] |
DocPathName=boot_code/boot_code_divide.h |
DocumentCLSID={0b720e69-67da-11d0-bf4f-0000c08cb0c0} |
IsChildFrameDetached=False |
IsActiveChildFrame=False |
ptn_Child1=StateMap |
[ProjectWorkspace.Frames.ChildFrames.Document-0.ViewFrame-0.StateMap] |
AFC_IN_REPORT=False |
[ProjectWorkspace.Frames.ChildFrames.Document-1] |
ptn_Child1=ViewFrame-0 |
[ProjectWorkspace.Frames.ChildFrames.Document-1.ViewFrame-0] |
DocPathName=boot_code.h |
DocumentCLSID={0b720e69-67da-11d0-bf4f-0000c08cb0c0} |
IsChildFrameDetached=False |
IsActiveChildFrame=True |
ptn_Child1=StateMap |
[ProjectWorkspace.Frames.ChildFrames.Document-1.ViewFrame-0.StateMap] |
AFC_IN_REPORT=False |
/trunk/v04.05/ep4ce6e22c8_demo_board.sdc
0,0 → 1,2
create_clock -name clk_50m_i clk_50m_i -period "50 MHz" |
derive_pll_clocks |
/trunk/v04.05/tst_encode.h
0,0 → 1,18
`ifndef _tst_encode_h_ |
`define _tst_encode_h_ |
|
// |
`define z 2'h0 |
`define nz 2'h1 |
`define lz 2'h2 |
`define nlz 2'h3 |
// |
`define e 4'h8 |
`define ne 4'h9 |
`define ls 4'ha |
`define nls 4'hb |
`define lu 4'hc |
`define nlu 4'hd |
// |
|
`endif // _tst_encode_h_ |
/trunk/v04.05/ep4ce6e22c8_demo_board.qws
0,0 → 1,18
[ProjectWorkspace] |
ptn_Child1=Frames |
[ProjectWorkspace.Frames] |
ptn_Child1=ChildFrames |
[ProjectWorkspace.Frames.ChildFrames] |
ptn_Child1=Document-0 |
ptn_Child2=Document-1 |
ptn_Child3=Document-2 |
[ProjectWorkspace.Frames.ChildFrames.Document-2] |
ptn_Child1=ViewFrame-0 |
[ProjectWorkspace.Frames.ChildFrames.Document-2.ViewFrame-0] |
DocPathName=pll.v |
DocumentCLSID={84678d98-dc76-11d0-a0d8-0020affa5bde} |
IsChildFrameDetached=False |
IsActiveChildFrame=True |
ptn_Child1=StateMap |
[ProjectWorkspace.Frames.ChildFrames.Document-2.ViewFrame-0.StateMap] |
AFC_IN_REPORT=False |