示例#1
0
def test_generator_L():
    expr = data.Counter(64)
    name = "blink"
    ss = io.StringIO()
    generator.generate_counter_module(ss, expr, name)

    expected = '''module bl_blink
(
  input wire CLOCK,
  input wire RESET,
  output wire Q
);
  reg flag = 0;
  assign Q = flag;
  reg [6-1:0] counter;
  always @(posedge CLOCK) begin
    if(RESET == 1) begin
      counter <= 6'd0;
      flag <= 0;
    end else begin
      if(counter < 6'd63) begin
        counter <= counter + 6'd1;
      end else begin
        counter <= 0;
        flag <= ~flag;
      end
    end
  end
endmodule // blink
'''
    assert(expected == ss.getvalue())
示例#2
0
def test_example_test9():
    name = 'test9'
    src = '''(L 9)'''
    expr = parser.parse_source(src)
    ss = io.StringIO()
    info = generator.generate_counter_module(ss, expr, name)

    expected_verilog = '''module bl_test9
(
  input wire CLOCK,
  input wire RESET,
  output wire Q
);
  reg flag = 0;
  assign Q = flag;
  reg [4-1:0] counter;
  always @(posedge CLOCK) begin
    if(RESET == 1) begin
      counter <= 4'd0;
      flag <= 0;
    end else begin
      if(counter < 4'd8) begin
        counter <= counter + 4'd1;
      end else begin
        counter <= 0;
        flag <= ~flag;
      end
    end
  end
endmodule // test9
'''
    assert (expected_verilog == ss.getvalue())
示例#3
0
def test_example_wide():
    name = 'wide'
    src = '''(L 1024 :out '(Q 7 3))'''
    expr = parser.parse_source(src)
    ss = io.StringIO()
    info = generator.generate_counter_module(ss, expr, name)

    expected_verilog = '''module bl_wide
(
  input wire CLOCK,
  input wire RESET,
  output wire [5-1:0] Q
);
  reg [10-1:0] counter;
  assign Q = counter[7:3];
  always @(posedge CLOCK) begin
    if(RESET == 1) begin
      counter <= 10'd0;
    end else begin
      if(counter < 10'd1023) begin
        counter <= counter + 10'd1;
      end else begin
        counter <= 0;
      end
    end
  end
endmodule // wide
'''

    assert (expected_verilog == ss.getvalue())

    expected_testbench = '''module tb_wide
(
);
  reg clk = 0;
  always begin
    #1 clk = ~clk;
  end
  reg reset;
  initial begin
    $dumpfile("wide.vcd");
    $dumpvars(0);
    reset = 1;
    repeat(10) @(posedge clk);
    reset <= 0;
    repeat(8192) @(posedge clk);
    $finish;
  end
  wire [5-1:0] Q_w;
  bl_wide wide_inst(
    .CLOCK(clk),.RESET(reset),.Q(Q_w)
  );
endmodule
'''

    ss = io.StringIO()
    generator.generate_testbench_module(ss, expr, name, info)
    assert (expected_testbench == ss.getvalue())
示例#4
0
def test_example_test0():
    name = 'test0'
    src = '''(L 0)'''
    expr = parser.parse_source(src)
    ss = io.StringIO()
    info = generator.generate_counter_module(ss, expr, name)

    expected_verilog = '''module bl_test0
(
  input wire CLOCK,
  input wire RESET,
  output wire Q
);
  reg flag = 0;
  assign Q = flag;
endmodule // test0
'''

    assert (expected_verilog == ss.getvalue())
示例#5
0
def test_example_detail():
    name = 'detail'

    src = '''(L 50000000
   :synth-tool "QUARTUS"
   :device "5CEBA4F23C7"
   :iomap '(CLOCK (M9 "3.3-V LVTTL") RESET (U13 "3.3-V LVTTL") Q (AA2 "3.3-V LVTTL"))
   :period '(CLOCK 20.0)
   )'''

    expr = parser.parse_source(src)
    ss = io.StringIO()
    info = generator.generate_counter_module(ss, expr, name)

    expected_verilog = '''module bl_detail
(
  input wire CLOCK,
  input wire RESET,
  output wire Q
);
  reg flag = 0;
  assign Q = flag;
  reg [26-1:0] counter;
  always @(posedge CLOCK) begin
    if(RESET == 1) begin
      counter <= 26'd0;
      flag <= 0;
    end else begin
      if(counter < 26'd49999999) begin
        counter <= counter + 26'd1;
      end else begin
        counter <= 0;
        flag <= ~flag;
      end
    end
  end
endmodule // detail
'''

    assert (expected_verilog == ss.getvalue())

    expected_testbench = '''module tb_detail
(
);
  reg clk = 0;
  always begin
    #1 clk = ~clk;
  end
  reg reset;
  initial begin
    $dumpfile("detail.vcd");
    $dumpvars(0);
    reset = 1;
    repeat(10) @(posedge clk);
    reset <= 0;
    repeat(400000000) @(posedge clk);
    $finish;
  end
  wire Q_w;
  bl_detail detail_inst(
    .CLOCK(clk),.RESET(reset),.Q(Q_w)
  );
endmodule
'''

    ss = io.StringIO()
    generator.generate_testbench_module(ss, expr, name, info)
    assert (expected_testbench == ss.getvalue())

    expected_qsf = '''set_global_assignment -name FAMILY "Cyclone V"
set_global_assignment -name DEVICE 5CEBA4F23C7
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name TOP_LEVEL_ENTITY bl_detail
set_global_assignment -name VERILOG_FILE detail.v
set_location_assignment PIN_M9 -to CLOCK
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to CLOCK
set_location_assignment PIN_U13 -to RESET
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to RESET
set_location_assignment PIN_AA2 -to Q
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q
set_global_assignment -name SDC_FILE detail.sdc
'''

    ss = io.StringIO()
    generator.generate_quartus_qsf(ss, expr, name)
    assert (expected_qsf == ss.getvalue())

    expected_qpf = '''PROJECT_REVISION = detail
'''

    ss = io.StringIO()
    generator.generate_quartus_qpf(ss, name)
    assert (expected_qpf == ss.getvalue())

    expected_sdc = '''set_time_format -unit ns -decimal_places 3
create_clock -name clk_CLOCK -period {20.000} -waveform {0.000 10.000} [get_ports {CLOCK}]
'''
    ss = io.StringIO()
    generator.generate_quartus_sdc(ss, expr)
    assert (expected_sdc == ss.getvalue())
示例#6
0
def test_example_wide2():
    name = 'wide2'
    src = '''(L 4294967296 :out '(Q 29 20)
   :synth-tool "QUARTUS"
   :device "5CEBA4F23C7"
   :iomap '(CLOCK (M9 "3.3-V LVTTL") RESET (U13 "3.3-V LVTTL")
	    Q ((AA2 "3.3-V LVTTL")
	       (AA1 "3.3-V LVTTL")
	       (W2 "3.3-V LVTTL")
	       (Y3 "3.3-V LVTTL")
	       (N2 "3.3-V LVTTL")
	       (N1 "3.3-V LVTTL")
	       (U2 "3.3-V LVTTL")
	       (U1 "3.3-V LVTTL")
	       (L2 "3.3-V LVTTL")
	       (L1 "3.3-V LVTTL")))
   :period '(CLOCK 20.0)
   )'''

    expr = parser.parse_source(src)
    ss = io.StringIO()
    info = generator.generate_counter_module(ss, expr, name)

    expected_verilog = '''module bl_wide2
(
  input wire CLOCK,
  input wire RESET,
  output wire [10-1:0] Q
);
  reg [32-1:0] counter;
  assign Q = counter[29:20];
  always @(posedge CLOCK) begin
    if(RESET == 1) begin
      counter <= 32'd0;
    end else begin
      if(counter < 32'd4294967295) begin
        counter <= counter + 32'd1;
      end else begin
        counter <= 0;
      end
    end
  end
endmodule // wide2
'''

    assert (expected_verilog == ss.getvalue())

    expected_testbench = '''module tb_wide2
(
);
  reg clk = 0;
  always begin
    #1 clk = ~clk;
  end
  reg reset;
  initial begin
    $dumpfile("wide2.vcd");
    $dumpvars(0);
    reset = 1;
    repeat(10) @(posedge clk);
    reset <= 0;
    repeat(34359738368) @(posedge clk);
    $finish;
  end
  wire [10-1:0] Q_w;
  bl_wide2 wide2_inst(
    .CLOCK(clk),.RESET(reset),.Q(Q_w)
  );
endmodule
'''
    ss = io.StringIO()
    generator.generate_testbench_module(ss, expr, name, info)
    assert (expected_testbench == ss.getvalue())

    expected_qsf = '''set_global_assignment -name FAMILY "Cyclone V"
set_global_assignment -name DEVICE 5CEBA4F23C7
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name TOP_LEVEL_ENTITY bl_wide2
set_global_assignment -name VERILOG_FILE wide2.v
set_location_assignment PIN_M9 -to CLOCK
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to CLOCK
set_location_assignment PIN_U13 -to RESET
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to RESET
set_location_assignment PIN_AA2 -to Q[0]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q[0]
set_location_assignment PIN_AA1 -to Q[1]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q[1]
set_location_assignment PIN_W2 -to Q[2]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q[2]
set_location_assignment PIN_Y3 -to Q[3]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q[3]
set_location_assignment PIN_N2 -to Q[4]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q[4]
set_location_assignment PIN_N1 -to Q[5]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q[5]
set_location_assignment PIN_U2 -to Q[6]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q[6]
set_location_assignment PIN_U1 -to Q[7]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q[7]
set_location_assignment PIN_L2 -to Q[8]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q[8]
set_location_assignment PIN_L1 -to Q[9]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to Q[9]
set_global_assignment -name SDC_FILE wide2.sdc
'''

    ss = io.StringIO()
    generator.generate_quartus_qsf(ss, expr, name)
    assert (expected_qsf == ss.getvalue())

    expected_qpf = '''PROJECT_REVISION = wide2
'''

    ss = io.StringIO()
    generator.generate_quartus_qpf(ss, name)
    assert (expected_qpf == ss.getvalue())

    expected_sdc = '''set_time_format -unit ns -decimal_places 3
create_clock -name clk_CLOCK -period {20.000} -waveform {0.000 10.000} [get_ports {CLOCK}]
'''
    ss = io.StringIO()
    generator.generate_quartus_sdc(ss, expr)
    assert (expected_sdc == ss.getvalue())