shabtay’s
take 04/28 - Cadence to submit
enhancements/modifications to existing pipes proposal based on Jason’s initial
email.
Committee agrees.
Still active. Latest
version of spec
JasonR>
After exploring pipes for several weeks, there is an idea that I would like to get feedback from the group:
Instead of passing the Pipe ID as an argument to a function, why not create a Pipe object instead? Here is an example:
// SystemVerilog
module test;
// parameter is pipe element size (32-bits)
scemi_pipe #(32) pipe0 ();
always @(posedge clk)
pipe0.receive(bus_data);
scemi_pipe #(36) pipe1 (); // parameter is pipe element size (36-bits)
always @(posedge clk) begin
pipe1.send(data_out);
pipe1.flush();
end
endmodule
/* C */
void thread0()
{
svScope scope;
scope = svGetScopeFromName("test.pipe0");
while(1) {
svBitVecVal message;
/* fill in the message */
svSetScope(scope);
scemi_pipe_send(&message);
}
}
void thread1()
{
svScope scope;
scope = svGetScopeFromName("test.pipe1");
while(1) {
svBitVecVal message[2];
svSetScope(scope);
scemi_pipe_receive(message);
/* do something with message */
}
}
Doing this, the pipe module can export tasks/functions such as try_send(), try_receive(), send(), receive(), flush(). To me this seems more consistent with DPI, where you call a function/task associated with the Pipe object, rather than passing an ID or handle. Also, having instances versus run-time function calls with Pipe ID, can make inferring the buffer objects more efficient. In addition to its ease of use and ease of implementation, the approach seems more "object-oriented", reduces the parameter list for function calls, and is more TLM-like.
<JasonR