Calvin Wong wrote: > I know this is going to be a lot to ask, but have you thought > about creating a threading methodology for synchronizing two > ruby processes.
I've implemented this feature and checked it into the head of the project's Darcs repository. Runtime performance is slightly reduced (for now) but that's a small price to pay for such a phenomenal advancement! :-) > Essentially I want to do the following in ruby. > > module test; > reg clk; initial clk = 0; > dut dut_inst (.clk_input(clk)); > > initial forever #5 clk = ~clk; > > initial > begin > repeat (5) @(posedge clk); > $display("Five cycles have passed"); > repeat (5) @(posedge clk); > $display("Another five cycles have passed"); > end > > endmoule Here is how I tested your example: 1. Create a 'test.v' file with the following content: module test; reg clk; initial clk = 0; endmodule 2. Generate a Ruby-VPI test for that file: ruby-vpi gen test.v 3. Replace the 'test_spec.rb' file's content with: Thread.new do loop do wait 5 Test.clk.intVal += 1 end end Thread.new do 5.times do |i| wait until Test.clk.posedge? puts "@#{simulation_time} got posedge #{i}" end puts("Five cycles have passed"); 5.times do |i| wait until Test.clk.posedge? puts "@#{simulation_time} got posedge #{i}" end puts("Another five cycles have passed"); finish end Notice the two new methods in the above code: "wait" and "finish". * "wait" is just an alias for the "advance_time" method. * "finish" stops the whole simulation. Without it, the second thread would exit after it finished and the first thread would continue executing forever (since its body contains an infinite loop). If you're not using any threads (like the default examples that come with Ruby-VPI), then there's no need to put "finish" at the bottom of the spec.rb file. Otherwise, you've got to make sure that your code has a "finish" call somewhere. Also, there is something to be said about the concurrency model. During each time step, all threads are executed until they either (1) finish executing and exit normally or (2) invoke the "wait" or "advance_time" method -- which causes them to be re-executed at a future time step. Anyway, try this out and let me know how it works. Cheers, Suraj