Hacker News new | ask | show | jobs
by akamoonknight 1441 days ago
This is a fascinating use case that wouldn't have occurred to me at all, quite cool, even if it "doesn't know anything about anything at all".

It even does pretty good with Verilog, which I assumed it would have issues with, admittedly some of this is just "google-able", but even so. It can even create a reasonable attempt at a testbench (even though it doesn't quite get it right), which is crazy to me.

*Explain this code:

module my_module(a,c,y); input a,c; output y; assign y= c ? a : 1'bz; endmodule*

This code is a Verilog module that defines three inputs (a, c, y) and one output (y). The output y is assigned to the value of a if c is true, otherwise it is assigned to 1'bz.

*What is 1'bz ?*

1'bz is a Verilog constant that represents a bit value of 'z', which is used to indicate a high impedance state.

*Why is high impedance used ?*

High impedance is used in digital circuits to allow multiple drivers to share a single bus without contention. When two or more drivers attempt to drive the same bus at the same time, a contention can occur and the bus voltage can become undefined. By using high impedance, drivers can avoid contention and allow the bus to remain stable.

*Give me a testbench for this module*

module testbench; reg a; reg c; wire y;

  my_module dut(a, c, y);
  
  initial begin
    a = 1'b0;
    c = 1'b0;
    #1;
    a = 1'b1;
    c = 1'b1;
    #1;
    a = 1'bz;
    c = 1'b1;
    #1;
    a = 1'bx;
    c = 1'b1;
    #1;
    $stop;
  end
endmodule

*Create the same testbench but add validation of the output.*

module testbench; reg a; reg c; wire y;

  my_module dut(a, c, y);
  
  initial begin
    a = 1'b0;
    c = 1'b0;
    #1;
    a = 1'b1;
    c = 1'b1;
    #1;
    a = 1'bz;
    c = 1'b1;
    #1;
    a = 1'bx;
    c = 1'b1;
    #1;
    $stop;
  end
  
  always @(*) begin
    if (c == 1'b0)
      assert(y == 1'b0);
    else if (c == 1'b1)
      assert(y == a);
    else if (c == 1'bz)
      assert(y == 1'bz);
    else if (c == 1'bx)
      assert(y == 1'bx);
  end 
endmodule
2 comments

Wow. I cannot fathom how it can work this well, though I think the validation is incorrect, the first assert shoukd check for z and not 0. Still, it's scary to be honest.
This is frighteningly impressive
This is already starting to feel like the Star Trek voice computer interface. You ask it questions, follow-up questions about anything.